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

Posted 李华东

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 ;  
     
}


































































































































































































































































































































以上是关于JAVA UI 实现ZIP的压缩与解压缩的主要内容,如果未能解决你的问题,请参考以下文章

java-a实现压缩与解压缩(zipgzip)

PclZip library能够压缩与解压缩Zip格式

Huffman的应用之文件压缩与解压缩

Huffman的应用之文件压缩与解压缩

Linux 压缩与解压缩工具之zip

Shell编程开发之Linux文件压缩与解压缩