当前位置:首页 > 开发 > 编程语言 > Java > 正文

java以zip格式实现压缩解压,有界面

发表于: 2011-11-20   作者:chuanheng   来源:转载   浏览次数:
摘要: 压缩 package Util; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.zip.CRC32; import java.ut

压缩

package Util;

import java.io.BufferedInputStream;  
import java.io.File;  
import java.io.FileInputStream;  
import java.io.FileOutputStream;  
import java.util.zip.CRC32;  
import java.util.zip.CheckedOutputStream;  
import java.util.zip.ZipEntry;  
import java.util.zip.ZipOutputStream;  

public class ZipUtils {  
  
    public static final String EXT = ".zip";  
    private static final String BASE_DIR = "";  
  
    // 符号"/"用来作为目录标识判断符  
    private static final String PATH = "/";  
    private static final int BUFFER = 1024;  
  
    /** 
     * 压缩 
     * @param srcFile 
     * @throws Exception 
     */  
    public static void compress(File srcFile) throws Exception {  
        String name = srcFile.getName();  
        String basePath = "D:\\"  ;
        String destPath = basePath + name + EXT;  
        compress(srcFile, destPath);  
    }  
  
    /** 
     * 压缩 
     *  
     * @param srcFile 
     *            源路径 
     * @param destPath 
     *            目标路径 
     * @throws Exception 
     */  
    public static void compress(File srcFile, File destFile) throws Exception {  
  
        // 对输出文件做CRC32校验  
        CheckedOutputStream cos = new CheckedOutputStream(new FileOutputStream(  
                destFile), new CRC32());  
  
        ZipOutputStream zos = new ZipOutputStream(cos);  
  
        compress(srcFile, zos, BASE_DIR);  
  
        zos.flush();  
        zos.close();  
    }  
  
    /** 
     * 压缩文件 
     *  
     * @param srcFile 
     * @param destPath 
     * @throws Exception 
     */  
    public static void compress(File srcFile, String destPath) throws Exception {  
        compress(srcFile, new File(destPath));  
    }  
  
    /** 
     * 压缩 
     *  
     * @param srcFile 
     *            源路径 
     * @param zos 
     *            ZipOutputStream 
     * @param basePath 
     *            压缩包内相对路径 
     * @throws Exception 
     */  
    private static void compress(File srcFile, ZipOutputStream zos,  
            String basePath) throws Exception {  
        if (srcFile.isDirectory()) {  
            compressDir(srcFile, zos, basePath);  
        } else {  
            compressFile(srcFile, zos, basePath);  
        }  
    }  
  
    /** 
     * 压缩 
     *  
     * @param srcPath 
     * @throws Exception 
     */  
    public static void compress(String srcPath) throws Exception {  
        File srcFile = new File(srcPath);  
  
        compress(srcFile);  
    }  
  
    /** 
     * 文件压缩 
     *  
     * @param srcPath 
     *            源文件路径 
     * @param destPath 
     *            目标文件路径 
     *  
     */  
    public static void compress(String srcPath, String destPath)  
            throws Exception {  
        File srcFile = new File(srcPath);  
  
        compress(srcFile, destPath);  
    }  
  
    /** 
     * 压缩目录 
     *  
     * @param dir 
     * @param zos 
     * @param basePath 
     * @throws Exception 
     */  
    private static void compressDir(File dir, ZipOutputStream zos,  
            String basePath) throws Exception {  
  
        File[] files = dir.listFiles();  
  
        // 构建空目录  
        if (files.length < 1) {  
            ZipEntry entry = new ZipEntry(basePath + dir.getName() + PATH);  
  
            zos.putNextEntry(entry);  
            zos.closeEntry();  
        }  
  
        for (File file : files) {  
  
            // 递归压缩  
            compress(file, zos, basePath + dir.getName() + PATH);  
  
        }  
    }  
  
    /** 
     * 文件压缩 
     *  
     * @param file 
     *            待压缩文件 
     * @param zos 
     *            ZipOutputStream 
     * @param dir 
     *            压缩文件中的当前路径 
     * @throws Exception 
     */  
    private static void compressFile(File file, ZipOutputStream zos, String dir)  
            throws Exception {  
  
        /** 
         * 压缩包内文件名定义 
         *  
         * <pre> 
         * 如果有多级目录,那么这里就需要给出包含目录的文件名 
         * 如果用WinRAR打开压缩包,中文名将显示为乱码 
         * </pre> 
         */  
        ZipEntry entry = new ZipEntry(dir + file.getName());  
  
        zos.putNextEntry(entry);  
  
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(  
                file));  
  
        int count;  
        byte data[] = new byte[BUFFER];  
        while ((count = bis.read(data, 0, BUFFER)) != -1) {  
            zos.write(data, 0, count);  
        }  
        bis.close();  
  
        zos.closeEntry();  
    }  
  
}  

 解压工具类

package Util;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

public class UnZipUtils {

    public static void main(String[] args) throws IOException {

        unzip("D:\\test\\test.zip");

    }

 

   //-----------------------------------------方法一------------------------------------------------------------  

    /**

     * 采用 <code>ZipInputStream<code>读Zip文件的方式

     * 解压到当前目录

     * @param zipFilePath 需要解压的文件的路径

     * @throws IOException 

     */

    public static void unzip(String zipFilePath) throws IOException {
    	
    	File zipFile = new File(zipFilePath);
    		
    	String zipFileName = zipFile.getName();
        	
        String rootFileName = zipFile.getParentFile().getPath() + "/" + zipFileName.substring(0, zipFileName.lastIndexOf("."));
        	
        unzip(zipFilePath, rootFileName);
    	
    }

 

    /**

     * 采用 <code>ZipInputStream<code>读Zip文件的方式

     * 解压到指定目录

     * @param zipFilePath 需要解压的文件的路径

     * @param unzipFilePath 解压后文件的路径

     * @throws IOException

     */

    public static void unzip(String zipFilePath, String unzipFilePath) throws IOException {

        File rootFile = new File(unzipFilePath);

        rootFile.mkdirs();

 

        ZipInputStream input = new ZipInputStream(

                new BufferedInputStream(new  FileInputStream(zipFilePath)));

        ZipEntry entry = null;

 

        //Zip文件将里面的每个文件都作为一个ZipEntry, 父目录和子文件为两个单独的entry

        while((entry = input.getNextEntry()) != null) {

            File tmpFile = new File(unzipFilePath + "/" + entry.getName());

            tmpFile.getParentFile().mkdirs();

 

            if(entry.isDirectory()) {

                tmpFile.mkdir();

            }

            else {

                BufferedOutputStream output = new BufferedOutputStream(new FileOutputStream(tmpFile));

                byte[] datas = new byte[2048];

                int count;

                while((count = input.read(datas)) != -1) {

                    output.write(datas, 0, count);

                }

                output.close();

            }

 

            input.closeEntry();

        }

 

        input.close();

    }}

 界面类

package main;

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 Util.UnZipUtils;
import Util.ZipUtils;

/**
 * @version 1.00 2011-11-20
 * @author Wang Chuanheng
 */
public class ZipTest
{
   public static void main(String[] args)
   {
      EventQueue.invokeLater(new Runnable()
         {
            public void run()
            {
               ZipTestFrame frame = new ZipTestFrame();
               frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
               frame.setVisible(true);
            }
         });
   }
}

/**
 * A frame with a text area to show the contents of a file inside a ZIP archive, a combo box to
 * select different files in the archive, and a menu to load a new archive.
 */
class ZipTestFrame extends JFrame
{
   public ZipTestFrame()
   {
      setTitle("不支持中文解压!author: 王传恒2009110336");
      setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);

      // add the menu and the Open and Exit menu items
      JMenuBar menuBar = new JMenuBar();
      JMenu menu1 = new JMenu("解压") ;
      JMenu menu2 = new JMenu("压缩") ;
      
      JMenuItem openItem = new JMenuItem("选择一个zip文件");
      menu1.add(openItem);
      openItem.addActionListener(new ActionListener()
         {
            public void actionPerformed(ActionEvent event)
            {
               JFileChooser chooser = new JFileChooser();
               chooser.setCurrentDirectory(new File("."));
               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()
         {
            public void actionPerformed(ActionEvent event)
            {
            	
            	try {
            		model.addElement("开始解压到文件所在目录") ;
            		UnZipUtils.unzip(zipname) ;
            		model.addElement("解压成功!") ;
                } catch (IOException e) {
                	model.addElement("解压error,不支持中文") ;
                	e.printStackTrace();
                }
                  
            }
         });
      // 添加
      JMenuItem addItem = new JMenuItem("添加要压缩的文件或文件夹");
      menu2.add(addItem);
      addItem.addActionListener(new ActionListener()
         {
            public void actionPerformed(ActionEvent event)
            {
            	
            	//addFile() ;  
            	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()
         {
            public void actionPerformed(ActionEvent event)
            {
                  try {
                	  
					ZipUtils.compress(addFilename) ;
					model.addElement("压缩成功!") ;
					
				} catch (Exception e) {
					model.addElement("压缩error,不支持中文") ;
					//System.out.println("压缩error!") ;
					e.printStackTrace();
				}
            }
               
         });
      
      //  exit
      JMenuItem exitItem = new JMenuItem("退出");
      menu1.add(exitItem);
      exitItem.addActionListener(new ActionListener()
         {
            public void actionPerformed(ActionEvent event)
            {
               System.exit(0);
            }
         });

      menuBar.add(menu1);
      menuBar.add(menu2) ;
      setJMenuBar(menuBar);

      // add the text area and combo box
      model = new DefaultListModel() ;
      model.addElement("文件列表") ;
      fileList = new JList(model);
      //fileList.setVisibleRowCount(12) ;
      add(new JScrollPane(fileList), BorderLayout.CENTER);
   }

   /**
    * Scans the contents of the ZIP archive and populates the combo box.
    */
   public void scanZipFile()
   {
	   model.removeAllElements() ;
      new SwingWorker<Void, String>()
         {
            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;
            }

            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("到     D:\\ ") ;
	   
   }
   
   public static final int DEFAULT_WIDTH = 800;
   public static final int DEFAULT_HEIGHT = 600;
   
   private JList fileList;
   private String zipname;
   private String addFilename ;
   DefaultListModel model ;
   
}
 

 

 

java以zip格式实现压缩解压,有界面

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
Java实现ZIP的解压与压缩功能基本都是使用了Java的多肽和递归技术,可以对单个文件和任意级联文件夹
程序实现了ZIP压缩。共分为2部分 : 压缩(compression)与解压(decompression) 大致功能包括用了
java 中如何进行zip包的解压缩呢? 有两种方式: (1)使用jdk 自带的zip工具 (2)使用apache旗下的commo
java 中如何进行zip包的解压缩呢? 有两种方式: (1)使用jdk 自带的zip工具 (2)使用apache旗下的commo
java 中如何进行zip包的解压缩呢? 有两种方式: (1)使用jdk 自带的zip工具 (2)使用apache旗下的commo
在企业开发过程中经常会遇到文件的压缩与解压,虽然网上很多流行的压缩文件格式都是RAR的,但是由于
最近在复习java的IO流,发现zip流这块还是空白,所以补补课,发现一片比较好的文档,所以转载了,出
Zip4j比jdk自带的zip类的好处是支持密码,操作更加简单,而且只要导入1个jar,不依赖于其他类库,所
Java API中的import java.util.zip.*;包下包含了Java对于压缩文件的所有相关操作。 我们可以使用该
zip [选项] [压缩后文件名] [压缩前的文件或者目录名称] -r表示压缩目录(recursion 递归) rm -rf
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号