chuanheng 发表于 2013-2-3 10:28:13

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

压缩
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;          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(newFileInputStream(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;                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 ;   }  
 
页: [1]
查看完整版本: java以zip格式实现压缩解压,有界面