JAVA UI 实现ZIP的压缩与解压缩

压缩与解压缩代码

package ZIP;

import java.io.*;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;
 
public class Zipun {
    public static void zip(String srcRootDir,File file,ZipOutputStream zos) throws Exception{
        if(file == null) return;
        if(file.isFile()){
            int count;
            //获取文件相对于压缩文件夹根目录的子路径
            String subPath = file.getAbsolutePath();
            int index = subPath.indexOf(srcRootDir);
            if(index != -1){
                subPath = subPath.substring(srcRootDir.length() + 1);
            }
            ZipEntry entry = new ZipEntry(subPath);
            zos.putNextEntry(entry);
            BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
            while((count = bis.read())!=-1)
                zos.write(count);
            bis.close();
            zos.closeEntry();
        }
        else{
            File[] childFileList = file.listFiles();
            for(int i=0;i<childFileList.length;i++){
                childFileList[i].getAbsolutePath().indexOf(file.getAbsolutePath());
                zip(srcRootDir,childFileList[i],zos);
            }
        }
    }
    /**
     * zip程序入口
     * @param srcPath 源文件路径
     * @param zipPath 压缩文件的路径
     * @param zipFileName 压缩文件的名字
     * @throws Exception 抛出异常
     */
    public static void zip(String srcPath,String zipPath,String zipFileName) throws Exception{
        ZipOutputStream zos = null;
        try{
            File srcFile = new File(srcPath);
            /**
             * 防止无限递归
             */
            if(srcFile.isDirectory()&&zipPath.indexOf(srcPath) != -1){
                throw new Exception("无限递归");
            }
            /**
             * 判断压缩文件保存的路径是否存在,不存在,就创建
             */
            File zipDir = new File(zipPath);
            if(!zipDir.exists() || !zipDir.isDirectory()){
                zipDir.mkdirs();
            }
            //如果只是压缩一个文件,则需要截取该文件的父目录
            String srcRootDir = srcPath;
            if(srcFile.isFile()){
                int index = srcPath.lastIndexOf(File.separator);
                if(index != -1){
                    srcRootDir = srcPath.substring(0,index);
                }
            }
            /**
             * 调用递归的方法进行目录或文件的压缩
             */
            zos = new ZipOutputStream(new FileOutputStream(new File(zipPath+File.separator+zipFileName)));
            //System.out.println(srcDir);
            zip(srcRootDir,srcFile,zos);
            zos.flush();
        }catch(Exception e){
            e.printStackTrace();
        }finally {
            if(zos != null) zos.close();
        }
    }
    /**
     * 解压缩zip包
     * @param zipFilePath zip文件的全路径
     * @param unzipFilePath 解压后的文件保存的路径
     * @param includeZipFileName 解压后的文件保存的路径是否包含压缩文件的文件名。true-包含;false-不包含
     */
    public static void unzip(String zipFilePath, String unzipFilePath) throws Exception
    {

File zipFile = new File(zipFilePath);
        //创建解压缩文件保存的路径
        File unzipFileDir = new File(unzipFilePath);
        if (!unzipFileDir.exists() || !unzipFileDir.isDirectory())
        {
            unzipFileDir.mkdirs();
        }

//开始解压
        ZipEntry entry = null;
        String entryFilePath = null, entryDirPath = null;
        File entryFile = null, entryDir = null;
        int index = 0, count = 0, bufferSize = 1024;
        byte[] buffer = new byte[bufferSize];
        BufferedInputStream bis = null;
        BufferedOutputStream bos = null;
        ZipFile zip = new ZipFile(zipFile);
        Enumeration<ZipEntry> entries = (Enumeration<ZipEntry>)zip.entries();
        //循环对压缩包里的每一个文件进行解压
        while(entries.hasMoreElements())
        {
            entry = entries.nextElement();
            //构建压缩包中一个文件解压后保存的文件全路径
            entryFilePath = unzipFilePath + File.separator + entry.getName();
            //构建解压后保存的文件夹路径
            index = entryFilePath.lastIndexOf(File.separator);
            if (index != -1)
            {
                entryDirPath = entryFilePath.substring(0, index);
            }
            else
            {
                entryDirPath = "";
            }
            entryDir = new File(entryDirPath);
            //如果文件夹路径不存在,则创建文件夹
            if (!entryDir.exists() || !entryDir.isDirectory())
            {
                entryDir.mkdirs();
            }

//创建解压文件
            entryFile = new File(entryFilePath);
            if (entryFile.exists())
            {
                //删除已存在的目标文件
                entryFile.delete();
            }

//写入文件
            bos = new BufferedOutputStream(new FileOutputStream(entryFile));
            bis = new BufferedInputStream(zip.getInputStream(entry));
            while ((count = bis.read(buffer, 0, bufferSize)) != -1)
            {
                bos.write(buffer, 0, count);
            }
            bos.flush();
            bos.close();
        }
    }

}
UI 部分代码

package ZIP;

import java.awt.*;  
import java.awt.event.*;  
import java.io.*;  
import java.util.*;  
import java.util.List;  
import java.util.zip.*;  
import javax.swing.*;  
import ZIP.Zipun;

public class ZipTest{  
   public static void main(String[] args){  
      EventQueue.invokeLater(new Runnable()  {  
            @Override
            public void run(){  
               ZipTestFrame frame = new ZipTestFrame();  
               frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
               frame.setVisible(true);  
            }  
         });  
   }  
}

class ZipTestFrame extends JFrame  {  
    
    public ZipTestFrame(){  
        setTitle("李华东 201501060709");  
        //窗口大小
        setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);  
 
        //创建菜单  
        JMenuBar menuBar = new JMenuBar();  
        JMenu menu1 = new JMenu("解压") ;  
        JMenu menu2 = new JMenu("压缩") ;  
        
        JMenuItem openItem = new JMenuItem("选择一个zip文件");  
        menu1.add(openItem);  
        openItem.addActionListener(new ActionListener(){  
            @Override
            public void actionPerformed(ActionEvent event){  
                //选择文件
               JFileChooser chooser = new JFileChooser();  
               chooser.setCurrentDirectory(new File("D:\\"));  
               //打开文件选择器对话框
               int r = chooser.showOpenDialog(ZipTestFrame.this);  
               if (r == JFileChooser.APPROVE_OPTION){  
                   //获取文件路径
                   zipname = chooser.getSelectedFile().getPath();             
                   scanZipFile();  
               }  
            }  
         });  
        //开始解压  
        JMenuItem jieyaItem = new JMenuItem("开始解压");  
        menu1.add(jieyaItem);  
        jieyaItem.addActionListener(new ActionListener(){  
            @Override
            public void actionPerformed(ActionEvent event){                  
                try {  
                    model.addElement("开始解压到文件所在目录") ;  
                    Zipun.unzip(zipname, zipname.substring(0, zipname.lastIndexOf(".")));
                    model.addElement("解压成功!") ;  
                } catch (Exception e) {  
                    model.addElement("解压错误!") ;  
                    e.printStackTrace();  
                }                      
            }  
         });  
        // 添加  
        JMenuItem addItem = new JMenuItem("添加要压缩的文件或文件夹");  
        menu2.add(addItem);  
        addItem.addActionListener(new ActionListener(){  
            @Override
            public void actionPerformed(ActionEvent event){    
                //选择文件
                JFileChooser chooser = new JFileChooser();  
                chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES) ;  
                chooser.setCurrentDirectory(new File("D://"));  
                int r = chooser.showOpenDialog(ZipTestFrame.this);  
                if (r == JFileChooser.APPROVE_OPTION){  
                  addFilename = chooser.getSelectedFile().getPath();  
                  addFile() ;
                  System.out.println(addFilename) ;  
               }  
            }  
         });  
        
        //压缩选定文件  
        JMenuItem zipItem = new JMenuItem("开始压缩");  
        menu2.add(zipItem);  
        zipItem.addActionListener(new ActionListener(){  
            @Override
            public void actionPerformed(ActionEvent event){  
                  try {  
                      Zipun.zip(addFilename,addFilename.substring(0, addFilename.lastIndexOf(File.separator)),new File(addFilename).getName()+".zip");
                    model.addElement("压缩成功!") ;  
                      
                 } catch (Exception e) {  
                    model.addElement("压缩错误!") ;  
                    e.printStackTrace();  
                }  
            }          
         });  
        
        //  exit  
        JMenuItem exitItem = new JMenuItem("退出");  
        menu1.add(exitItem);  
        exitItem.addActionListener(new ActionListener(){  
            @Override
            public void actionPerformed(ActionEvent event)  
            {  
               System.exit(0);  
            }  
         });  
        menuBar.add(menu1);  
        menuBar.add(menu2) ;  
        setJMenuBar(menuBar);  
 
        model = new DefaultListModel() ;  
        model.addElement("文件列表") ;  
          fileList = new JList(model);  
          add(new JScrollPane(fileList), BorderLayout.CENTER);  
    }  
 
    //显示文件列表
    public void scanZipFile(){  
       model.removeAllElements() ;  
       new SwingWorker<Void, String>(){  
            @Override
            protected Void doInBackground() throws Exception{  
               ZipInputStream zin = new ZipInputStream(new FileInputStream(zipname));  
               ZipEntry entry;  
               while ((entry = zin.getNextEntry()) != null){  
                  publish(entry.getName());  
                  zin.closeEntry();  
               }  
               zin.close();  
               return null;  
            }
            @Override
            protected void process(List<String> names){     
               for (String name : names)  
                  model.addElement(name);         
            }  
         }.execute();  
    }  
     
     
    public void addFile(){  
       //System.out.println("addFile()") ;  
       model.removeAllElements() ;        
       model.addElement("准备压缩: "+addFilename) ;  
       model.addElement("到当前目录下的 "+new File(addFilename).getName()+".zip 文件下") ;         
    }  
    /**
     * 设置宽度和长度
     * 自适应当前屏幕的大小
     */
    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();     
    public  final int DEFAULT_WIDTH = (int)screenSize.getWidth()/2;  
    public  final int DEFAULT_HEIGHT = (int)screenSize.getHeight()/2;  
     
    private JList fileList;  
    private String zipname;  
    private String addFilename ;  
    DefaultListModel model ;  
     
}

原文地址:https://www.cnblogs.com/1iHu4D0n9/p/8977454.html

时间: 2024-10-13 02:30:11

JAVA UI 实现ZIP的压缩与解压缩的相关文章

zip格式压缩、解压缩(C#)

压缩方法 #region 压缩 /// <summary> /// 压缩 /// </summary> /// <param name="bytes">未被压缩的字节数据</param> /// <returns></returns> public static byte[] Compress(byte[] bytes) { if (bytes == null) return null; using (Memory

使用zip/unzip压缩、解压缩文件

今天项目升级模块中有需要进行解压缩操作,本来打算使用创建进程调用winrar工具的方式来解压,在VS2008环境下也是能跑通的,但是因为产品升级程序是以windows服务的方式运行的,使用这个方式怎么都行不通,进程能正常退出,但是就是解压不出来,进程管理器中也显示winrar进程没有退出,可能导致解压后的文件未释放,至于具体原因,暂时还未明了,希望有经验的朋友指点一下!但是项目还得继续做啊,因此只能换其他方式了. 通过在网上查找资料,找到了这个东东,http://www.codeproject.

JAVA,使用ant-1.6.5,压缩、解压缩辅助类代码

有的时候,需要做文件的压缩.解压缩. java自身提供了已压缩,解压缩的原生类库.不过有开源代码的话,我一般是选择使用开源类库. 下面就贴一下,我使用ant-1.6.5的zip压缩.解压缩的代码吧. ZipUtil.java import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStr

Java.util.zip 压缩与解压缩工具类

Java.util.zip 提供用于读写标准 ZIP 和 GZIP 文件格式的类. 还包括使用 DEFLATE 压缩算法(用于 ZIP 和 GZIP 文件格式)对数据进行压缩和解压缩的类. 依赖 Jdk 编写该工具类,不依赖任何第三方 jar,随用随取,实现功能大体如下: 1.目录级别递归压缩与解压缩 zip: 2.单文件压缩和解压缩 zip : import java.io.*; import java.util.zip.ZipEntry; import java.util.zip.ZipIn

Java对zip格式压缩和解压缩

Java对zip格式压缩和解压缩 通过使用java的相关类可以实现对文件或文件夹的压缩,以及对压缩文件的解压. 1.1 ZIP和GZIP的区别 gzip是一种文件压缩工具(或该压缩工具产生的压缩文件格式),它的设计目标是处理单个的文件.gzip在压缩文件中的数据时使用的就是zlib.为了保存与文件属性有关的信息,gzip需要在压缩文件(*.gz)中保存更多的头信息内容,而zlib不用考虑这一点.但gzip只适用于单个文件,所以我们在UNIX/Linux上经常看到的压缩包后缀都是*.tar.gz或

java架构 [Java 基础] 使用java.util.zip包压缩和解压缩文件

Java API中的import java.util.zip.*;包下包含了Java对于压缩文件的所有相关操作. 我们可以使用该包中的方法,结合IO中的相关知识,进行文件的压缩和解压缩相关操作. ZipFile java中的每一个压缩文件都是可以使用ZipFile来进行表示的. File file = new File("F:/zippath.zip"); ZipFile zipFile = new ZipFile(file); System.out.println("压缩文

[Java 基础] 使用java.util.zip包压缩和解压缩文件

reference :  http://www.open-open.com/lib/view/open1381641653833.html Java API中的import java.util.zip.*;包下包含了Java对于压缩文件的所有相关操作. 我们可以使用该包中的方法,结合IO中的相关知识,进行文件的压缩和解压缩相关操作. ZipFile java中的每一个压缩文件都是可以使用ZipFile来进行表示的. File file = new File("F:/zippath.zip&quo

Java用ZIP格式压缩和解压缩文件

转载:java jdk实例宝典 感觉讲的非常好就转载在这保存! java.util.zip包实现了Zip格式相关的类库,使用格式zip格式压缩和解压缩文件的时候,须要导入该包. 使用zipoutputstream能够实现文件压缩,全部写入到zipoutputstream输入流中的数据,都会被ZIP格式压缩. 每一个被压缩的文件或者文件夹在zip文件里都相应一个zipentry对象,每一个zipentry都有一个name属性,表示它相对于zip文件文件夹的相对路径,对于文件夹,路径以“/“结尾,对

JAVA对字符串的压缩与解压缩

import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.util.zip.GZIPInputStream;import java.util.zip.GZIPOutputStream;import java.util.zip.ZipEntry;import java.util.zip.ZipInputStream;import ja