`
beyond429
  • 浏览: 95758 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

利用java的ZipOutputStream类解压文件或文件夹中的文件

    博客分类:
  • java
阅读更多
package codemaking.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.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;
import java.util.zip.GZIPInputStream;
import java.io.DataInputStream;



/**
* Description: 此类用于...
*
* @author    wunaigang(2005-6-21)
* @version   1.0.0
*/
public class ZipManager {



        /**
         * zip压缩功能测试. 将d:\\temp\\zipout目录下的所有文件连同子目录压缩到d:\\temp\\out.zip.
         *
         * @param baseDir 所要压缩的目录名(包含绝对路径)
         * @param objFileName 压缩后的文件名
         * @throws Exception
         */
        public void createZip(String baseDir, String objFileName) throws Exception {
                File folderObject = new File(baseDir);



                if (folderObject.exists()){
                        List fileList = getSubFiles(new File(baseDir));



                        //压缩文件名
                        ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(objFileName));



                        ZipEntry ze = null;
                        byte[] buf = new byte[1024];
                        int readLen = 0;
                        for (int i = 0; i < fileList.size(); i++) {
                                File f = (File) fileList.get(i);
                                System.out.println("Adding: " + f.getPath() + f.getName());



                                //创建一个ZipEntry,并设置Name和其它的一些属性
                                ze = new ZipEntry(getAbsFileName(baseDir, f));
                                ze.setSize(f.length());
                                ze.setTime(f.lastModified());



                                //将ZipEntry加到zos中,再写入实际的文件内容
                                zos.putNextEntry(ze);
                                InputStream is = new BufferedInputStream(new FileInputStream(f));
                                while ((readLen = is.read(buf, 0, 1024)) != -1) {
                                        zos.write(buf, 0, readLen);
                                }
                                is.close();
                                System.out.println("done...");
                        }
                        zos.close();
                }else{
                        throw new Exception("this folder isnot exist!");
                }
        }
        /**
         * zip压缩功能测试. 将指定文件压缩后存到一压缩文件中
         *
         * @param baseDir 所要压缩的文件名
         * @param objFileName 压缩后的文件名
         * @return 压缩后文件的大小
         * @throws Exception
         */
        public long createFileToZip(String zipFilename,String sourceFileName) throws Exception {



                File  sourceFile = new File(sourceFileName);



                byte[] buf = new byte[1024];



                //压缩文件名
                File objFile = new File(zipFilename);



                ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(objFile));



                ZipEntry ze = null;
                //创建一个ZipEntry,并设置Name和其它的一些属性
                ze = new ZipEntry(sourceFile.getName());
                ze.setSize(sourceFile.length());
                ze.setTime(sourceFile.lastModified());



                //将ZipEntry加到zos中,再写入实际的文件内容
                zos.putNextEntry(ze);



                InputStream is = new BufferedInputStream(new FileInputStream(sourceFile));



                int readLen = -1;
                while ((readLen = is.read(buf, 0, 1024)) != -1) {
                        zos.write(buf, 0, readLen);
                }
                is.close();
                zos.close();




                return objFile.length();
        }
        /**
         * zip压缩功能测试. 将指定文件压缩后存到一压缩文件中
         *
         * @param baseDir 所要压缩的文件名
         * @param objFileName 压缩后的文件名
         * @return 压缩后文件的大小
         * @throws Exception
         */
        public long createFileToZip(File sourceFile,File zipFile)throws IOException {




                byte[] buf = new byte[1024];



                //压缩文件名
                File objFile = zipFile;



                ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(objFile));



                ZipEntry ze = null;
                //创建一个ZipEntry,并设置Name和其它的一些属性
                ze = new ZipEntry(sourceFile.getName());
                ze.setSize(sourceFile.length());
                ze.setTime(sourceFile.lastModified());



                //将ZipEntry加到zos中,再写入实际的文件内容
                zos.putNextEntry(ze);



                InputStream is = new BufferedInputStream(new FileInputStream(sourceFile));



                int readLen = -1;
                while ((readLen = is.read(buf, 0, 1024)) != -1) {
                        zos.write(buf, 0, readLen);
                }
                is.close();
                zos.close();



                return objFile.length();
        }



        /**
         * 测试解压缩功能. 将d:\\download\\test.zip连同子目录解压到d:\\temp\\zipout目录下.
         *
         * @throws Exception
         */
        public void releaseZipToFile(String sourceZip, String outFileName)
                        throws IOException{
                      ZipFile zfile=new ZipFile(sourceZip);
                      System.out.println(zfile.getName());
                      Enumeration zList=zfile.entries();
                      ZipEntry ze=null;
                      byte[] buf=new byte[1024];
                      while(zList.hasMoreElements()){
                      //从ZipFile中得到一个ZipEntry
                      ze=(ZipEntry)zList.nextElement();
                      if(ze.isDirectory()){
                      continue;
                      }
                      //以ZipEntry为参数得到一个InputStream,并写到OutputStream中
                      OutputStream os=new BufferedOutputStream(new FileOutputStream(getRealFileName(outFileName, ze.getName())));
                      InputStream is=new BufferedInputStream(zfile.getInputStream(ze));
                      int readLen=0;
                      while ((readLen=is.read(buf, 0, 1024))!=-1) {
                      os.write(buf, 0, readLen);
                      }
                      is.close();
                      os.close();
                      System.out.println("Extracted: "+ze.getName());
                      }
                      zfile.close();

        }



        /**
         * 取得指定目录下的所有文件列表,包括子目录.
         *
         * @param baseDir
         *            File 指定的目录
         * @return 包含java.io.File的List
         */
        private List getSubFiles(File baseDir) {
                List ret = new ArrayList();
                //File base=new File(baseDir);
                File[] tmp = baseDir.listFiles();
                for (int i = 0; i < tmp.length; i++) {
                        if (tmp[i].isFile()) {
                                ret.add(tmp[i]);
                        }
                        if (tmp[i].isDirectory()) {
                                ret.addAll(getSubFiles(tmp[i]));
                        }
                }
                return ret;
        }



        /**
         * 给定根目录,返回一个相对路径所对应的实际文件名.
         *
         * @param baseDir
         *            指定根目录
         * @param absFileName
         *            相对路径名,来自于ZipEntry中的name
         * @return java.io.File 实际的文件
         */
        private File getRealFileName(String baseDir, String absFileName) {
                String[] dirs = absFileName.split("/");
                //System.out.println(dirs.length);
                File ret = new File(baseDir);
                //System.out.println(ret);
                if (dirs.length > 1) {
                        for (int i = 0; i < dirs.length - 1; i++) {
                                ret = new File(ret, dirs[i]);
                        }
                }
                if (!ret.exists()) {
                        ret.mkdirs();
                }
                ret = new File(ret, dirs[dirs.length - 1]);
                return ret;
        }



        /**
         * 给定根目录,返回另一个文件名的相对路径,用于zip文件中的路径.
         *
         * @param baseDir
         *            java.lang.String 根目录
         * @param realFileName
         *            java.io.File 实际的文件名
         * @return 相对文件名
         */
        private String getAbsFileName(String baseDir, File realFileName) {
                File real = realFileName;
                File base = new File(baseDir);
                String ret = real.getName();
                while (true) {
                        real = real.getParentFile();
                        if (real == null)
                                break;
                        if (real.equals(base))
                                break;
                        else {
                                ret = real.getName() + "/" + ret;
                        }
                }
                System.out.println("TTTTT" + ret);
                return ret;
        }


        public void testReadZip() throws Exception{
        String baseDir="d:\\temp\\zipout";
        ZipFile zfile=new ZipFile("d:\\download\\src.zip");
        System.out.println(zfile.getName());
        Enumeration zList=zfile.entries();
        ZipEntry ze=null;
        byte[] buf=new byte[1024];
        while(zList.hasMoreElements()){
        //从ZipFile中得到一个ZipEntry
        ze=(ZipEntry)zList.nextElement();
        if(ze.isDirectory()){
        continue;
        }
        //以ZipEntry为参数得到一个InputStream,并写到OutputStream中
        OutputStream os=new BufferedOutputStream(new FileOutputStream(getRealFileName(baseDir, ze.getName())));
        InputStream is=new BufferedInputStream(zfile.getInputStream(ze));
        int readLen=0;
        while ((readLen=is.read(buf, 0, 1024))!=-1) {
        os.write(buf, 0, readLen);
        }
        is.close();
        os.close();
        System.out.println("Extracted: "+ze.getName());
        }
        zfile.close();
        }


   public static void main(String args[]){
     ZipManager manager = new ZipManager();
     try {
       //manager.releaseZipToFile("c:\\test.zip","c:\\test");
       manager.testReadZip();
     }
     catch (Exception e) {}
     System.out.println("over");
   }



}

分享到:
评论

相关推荐

    Java代码 可以压缩文件夹到指定目录和指定名称,将文件或者文件夹中的文件转成base64格式

    同时,将文件或文件夹中的文件转换为Base64编码是一种在内存中传输和存储二进制数据的有效方式,特别是在网络通信中。Base64是一种编码机制,它可以将任何二进制数据转换为ASCII字符串,确保数据在不支持二进制传输...

    纯java实现文件的解压,压缩,可以分别解压/压缩 单条,多条,文件,文件夹

    本篇文章将深入探讨如何使用纯Java实现这一功能,特别关注如何解压和压缩单个或多个文件以及整个文件夹。我们将涵盖核心的Java API,如`java.util.zip`包中的类,以及实际的代码示例。 首先,我们需要了解`java....

    Java实现将多目录多层级文件打成ZIP包,以及解压ZIP包

    - 首先,需要导入`java.util.zip`包中的`ZipOutputStream`和`ZipEntry`类,它们分别用于创建ZIP输出流和表示ZIP包内的每个条目(文件或目录)。 - 使用`File`类遍历指定的目录及其子目录,获取所有需要打包的文件...

    java将文件夹压缩成zip,解压zip压缩包

    2. **遍历文件夹**:使用`File`类的`listFiles()`方法获取文件夹中的所有文件和子文件夹,并对每一个文件进行处理。 3. **添加到ZIP**:对于每个文件,创建一个`ZipEntry`对象,设置其名称(相对于压缩根目录的路径...

    解压zip压缩文件,支持多文件目录解压,中文乱码问题

    在使用Java对ZIP压缩文件进行解压的方式中有两种,一种是使用apache提供的ant.jar工具包,但是如果ZIP文件中含有中文名称的文件,在解压后,文件名将出现乱码,另一种是使用Java自身JDK中java.util.zip包下工具类,...

    java 操作Zip文件(压缩、解压、加密).zip

    - **压缩文件和目录**:你可以通过创建一个`ZipFile`对象,并调用`addFiles()`或`addFolder()`方法来将单个文件或整个目录添加到Zip文件中。 - **解压缩文件**:使用`unzip()`方法可以解压缩整个Zip文件,或者通过...

    java解压缩文件文件夹

    同时,注意错误处理和资源管理,避免内存泄漏或文件未关闭的情况。 在实际项目中,你可能会选择使用第三方库如Apache Commons Compress或Google的Guava,它们提供了更丰富的功能和更好的性能。然而,了解基础的Java...

    运用java压缩文件夹并备份至目标文件夹

    在这个例子中,`addFolderToZip`方法递归地遍历文件夹中的所有文件,创建对应的`ZipEntry`对象,并将文件内容写入`ZipOutputStream`。注意,为了保持文件结构,我们需要将文件路径转换为相对路径(`prefix + path....

    java实现Ftp批量下载文件及解压

    对于下载的压缩文件,可以使用Java的`ZipInputStream`或`JarInputStream`进行解压。例如,如果是.zip文件,可以这样做: ```java ZipInputStream zis = new ZipInputStream(new FileInputStream(zipFilePath)); ...

    基于Java向zip压缩包追加文件

    在Java编程中,向现有的ZIP压缩包追加文件通常需要经过解压、修改、再压缩的步骤,因为标准的Java ZIP库(如`java.util.zip`包)并不直接支持追加到已存在的ZIP文件。本篇文章将深入探讨如何实现这个功能,主要关注...

    Java压缩解压文件

    在Java编程中,压缩和解压文件是一项常见的任务,它涉及到对文件或文件夹进行编码以减少存储空间,以及在需要时将它们恢复到原始形式。`ZipUtils.java`文件很可能是实现这一功能的一个工具类。这篇博客文章《Java...

    java zip压缩解压工具解决中文乱码问题

    以上代码片段展示了如何利用Apache Commons IO库来处理中文乱码问题,使得在Java中进行ZIP文件的压缩和解压更加便捷和准确。在实际开发中,根据项目需求,可以选择使用标准库或者Apache Commons IO库,确保文件名和...

    Java Zip压缩:简化文件和文件夹的压缩操作

    在Java编程语言中,处理文件和文件夹的压缩与解压是常见的任务,尤其是在需要传输大量数据或存储空间有限的情况下。Zip格式是一种广泛使用的压缩格式,Java提供了内建的API来支持这种格式,使得开发者可以方便地进行...

    java实现文件夹解压和压缩

    "java实现文件夹解压和压缩" Java实现文件夹解压和压缩是指通过Java语言对文件夹进行...Java实现文件夹解压和压缩需要使用java.util.zip包中的类和接口,并且需要考虑到文件夹中的所有文件和子文件夹的解压缩操作。

    java zip 压缩解压例子

    在Java中,我们可以使用`java.util.zip`包中的类,如`ZipOutputStream`和`ZipInputStream`来实现文件或目录的压缩与解压。下面将详细介绍这些知识点。 ### 1. `java.util.zip`包 这个包提供了处理多种压缩格式的类...

    JAVA实现的文件压缩

    在Java编程语言中,我们可以利用SWING库来构建用户界面,实现文件或文件夹的压缩功能。以下是对"JAVA实现的文件压缩"这一主题的详细讲解。 1. **Java SWING简介** Java SWING是Java Foundation Classes (JFC)的一...

    java版zip压缩解压代码

    这个程序主要利用了Java的内置库,尤其是`java.util.zip`包中的类,如`ZipOutputStream`和`ZipInputStream`,来实现对文件和文件夹的ZIP压缩与解压操作。以下是关于这些知识点的详细说明: 1. **ZipOutputStream**:...

    解决java压缩、解压缩含中文字符的文件或文件夹问题

    通过对JDK的java.util.zip下的ZipInputStream和ZipOutputStream类进行改造,彻底解决压缩和解压缩文件时的中文文件名乱码问题。 包含已大好的jar包,以及一个如何使用的Demo程序。

    java 解压与压缩文件夹的实例详解

    然后,它遍历压缩包中的每个文件,使用 ZipFile 方法将每个文件写入到指定的文件夹中。最后,它关闭 ZipInputStream 对象,完成解压文件夹的创建。 三、压缩文件夹的实现原理 Java 的压缩文件夹是基于 ZIP 算法的...

    java文件资源管理系统

    - **创建**:在指定位置创建新的文件夹,这涉及到Java的`java.io.File`类,通过调用`mkdir()`或`mkdirs()`方法来创建单级或多级目录。 - **删除**:使用`delete()`方法删除文件夹,需要注意处理删除非空文件夹的...

Global site tag (gtag.js) - Google Analytics