`
wuce7758
  • 浏览: 178103 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
  • YTT1121: 有网络拓扑发现的源代码么?能不能发我一份学习一下,现在我正要做 ...
    java拓扑图
  • YTT1121: 大神,有网络拓扑发现的源代码么?或者您会编写么?我需要做科研改 ...
    java拓扑图
  • YTT1121: 大神,有网络拓扑发现的源代码么?或者您会编写么?我需要做科研改 ...
    java拓扑图
  • poettang: 求代码分享学习,谢谢!膜拜大神!258026921@qq.co ...
    java拓扑图
  • oiqio: 87836238@qq.com,感谢楼主,来一份~
    java拓扑图

Java版的WinRAR工具

阅读更多
Java版的WinRAR工具

最近做个东西,需要强大的Java版压缩组建支持,可惜没有开源的,最后实在没办法了。决定自己实现个,反正JDK中提供了最基础的API。

标题说WinRAR工具,夸大了,还没WinRAR那么强大,仅仅是一个zip工具组建,没有GUI界面,只有工具方法。

目标:
实现一个像WinRAR、WinZip一样可以同时混合压缩或者解压缩文件和文件夹的工具。目前仅支持zip文件,因为SUN Java API仅支持zip和gzip两种格式,gzip就像玩具枪,不中用,就不说了,下面是实现代码。

实现:
寥寥不到百行代码就搞定了,难点在于一个递归算法。

import java.io.*;
import java.util.Collection;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;
//import org.apache.tools.zip.ZipEntry;
//import org.apache.tools.zip.ZipOutputStream;

/**
* Java版的Zip工具
*
* @author leizhimin 2008-11-27 11:16:05
*/
public class ZipUtils {
        private static final int BUFF_SIZE = 1024 * 1024;     //1M Byte

        /**
         * 批量压缩文件(夹)
         *
         * @param resFileList 要压缩的文件(夹)列表
         * @param zipFile         生成的压缩文件
         * @throws IOException 当压缩过程出错时抛出
         */
        public static void zipFiles(Collection<File> resFileList, File zipFile) throws IOException {
                ZipOutputStream zipout = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(zipFile), BUFF_SIZE));
                for (File resFile : resFileList) {
                        zipFile(resFile, zipout, "");
                }
                zipout.close();
        }

        /**
         * 批量压缩文件(夹)
         *
         * @param resFileList 要压缩的文件(夹)列表
         * @param zipFile         生成的压缩文件
         * @param comment         压缩文件的注释
         * @throws IOException 当压缩过程出错时抛出
         */
        public static void zipFiles(Collection<File> resFileList, File zipFile, String comment) throws IOException {
                ZipOutputStream zipout = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(zipFile), BUFF_SIZE));
                for (File resFile : resFileList) {
                        zipFile(resFile, zipout, "");
                }
                zipout.setComment(comment);
                zipout.close();
        }

        /**
         * 解压缩一个文件
         *
         * @param zipFile        压缩文件
         * @param folderPath 解压缩的目标目录
         * @throws IOException 当压缩过程出错时抛出
         */
        public static void upZipFile(File zipFile, String folderPath) throws IOException {
                ZipFile zf = new ZipFile(zipFile);
                for (Enumeration entries = zf.entries(); entries.hasMoreElements();) {
                        ZipEntry entry = ((ZipEntry) entries.nextElement());
                        InputStream in = zf.getInputStream(entry);
                        OutputStream out = new FileOutputStream(folderPath + File.separator + entry.getName());
                        byte buffer[] = new byte[BUFF_SIZE];
                        int realLength;
                        while ((realLength = in.read(buffer)) > 0) {
                                out.write(buffer, 0, realLength);
                        }
                        in.close();
                        out.close();
                }
        }

        private static void zipFile(File resFile, ZipOutputStream zipout, String rootpath) throws IOException {
                rootpath = rootpath + (rootpath.trim().length() == 0 ? "" : File.separator) + resFile.getName();
                if (resFile.isDirectory()) {
                        File[] fileList = resFile.listFiles();
                        for (File file : fileList) {
                                zipFile(file, zipout, rootpath);
                        }
                } else {
                        byte buffer[] = new byte[BUFF_SIZE];
                        BufferedInputStream in = new BufferedInputStream(new FileInputStream(resFile), BUFF_SIZE);
                        zipout.putNextEntry(new ZipEntry(rootpath));
                        int realLength;
                        while ((realLength = in.read(buffer)) != -1) {
                                zipout.write(buffer, 0, realLength);
                        }
                        in.close();
                        zipout.flush();
                        zipout.closeEntry();
                }
        }
}

测试代码:
public class Test {
        public static void main(String[] args) throws IOException {
                Collection<File> resFileList = new ArrayList<File>();
                resFileList.add(new File("C:\\new.gif"));
                resFileList.add(new File("C:\\HelloWorld.java"));
                resFileList.add(new File("C:\\crebas.sql"));
                resFileList.add(new File("E:\\log.log"));
                resFileList.add(new File("C:\\ooo\\upx\\"));

                File zipFile = new File("C:\\txxxt.zip");

                ZipUtils.zipFiles(resFileList, zipFile);
        }
}

运行结果:
压缩成功!

Process finished with exit code 0

查看硬盘的上压缩文件,没错,贴个图看看:



呵呵,经过查看,没问题,就是注释乱码。

经过反复测试,发现中文支持有问题。

google了一下解决方案,用ant包中的两个类
//import org.apache.tools.zip.ZipEntry;
//import org.apache.tools.zip.ZipOutputStream;
替换Java包的对应的两个类
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;
即可完美支持中文。
分享到:
评论

相关推荐

    java 基于WinRAR6.02封装的压缩及分卷压缩工具

    可以进行单压缩或分卷压缩(后续会基于WinRAR6.02版本封装解压工具) 支持功能: 1,设置压缩密码(设置解压密码或压缩文件打开密码,默认没有密码) 2,设置五种压缩方式(存储、最快、快速、标准、较好、最优,默认为标准) 3...

    windows 下java调用winrar压缩文件为rar 格式

    NULL 博文链接:https://thinktothings.iteye.com/blog/1436303

    JAVA文件传输工具

    我自己做的Java文件传输工具,可以传送超大文件,所有源代码都打包到jar文件中去了,源程序均有注释。用WinRar加压即可。不过还有些许bug,在以后的版本中会继续改进,希望大家多支持。

    Java 报表工具BIRT完全入门初级版(中文PDF版)

    Java 报表工具BIRT完全入门初级版 ●高清中文PDF版 ●清晰易懂,图文并茂,内容丰富 ●入门必备,必有收获 ●内附插件下载地址和说明(readme.txt) ●请用winrar3.x或以上版本解压后使用 ●经诺顿检测无毒无广告

    Java反编译.rar

    java反编译class文件 java反编译工具类.

    DJ Java Decompiler 3.12.12.96 老朽痴拙汉化版(JAVA反编译)

    JAVA工具精品新译&lt;5&gt;DJ Java Decompiler 3.12.12.96 32位老朽痴拙汉化特别版(JAVA反编译之王) 使用DJ Java Decompiler可用於 2000,XP,2003,Vista,Windows7, 32位环境.你可以反编译class文件并且可以保存为文本...

    java源码包---java 源码 大量 实例

     Java zip压缩包查看程序,应用弹出文件选择框,选择ZIP格式的压缩文件,可以像Winrar软件一样查看压缩文件内部的文件及文件夹,源码截图如上所示。 Java 数字签名、数字证书生成源码 2个目标文件 摘要:JAVA源码,...

    java解压jar类查找工具

    多线程 java 类查找工具 。搜索指定目录下的jar和zip,查找对应的class文件。注意不带包名哦。原理很简单就是查文件名。

    JAVA上百实例源码以及开源项目

     Java zip压缩包查看程序,应用弹出文件选择框,选择ZIP格式的压缩文件,可以像Winrar软件一样查看压缩文件内部的文件及文件夹,源码截图如上所示。 Java 数字签名、数字证书生成源码 2个目标文件 摘要:JAVA源码,...

    JAVA上百实例源码以及开源项目源代码

     Java zip压缩包查看程序,应用弹出文件选择框,选择ZIP格式的压缩文件,可以像Winrar软件一样查看压缩文件内部的文件及文件夹,源码截图如上所示。 Java 数字签名、数字证书生成源码 2个目标文件 摘要:JAVA源码,...

    java源码包4

     Java zip压缩包查看程序,应用弹出文件选择框,选择ZIP格式的压缩文件,可以像Winrar软件一样查看压缩文件内部的文件及文件夹,源码截图如上所示。 Java 数字签名、数字证书生成源码 2个目标文件 摘要:JAVA源码...

    java源码包3

     Java zip压缩包查看程序,应用弹出文件选择框,选择ZIP格式的压缩文件,可以像Winrar软件一样查看压缩文件内部的文件及文件夹,源码截图如上所示。 Java 数字签名、数字证书生成源码 2个目标文件 摘要:JAVA源码...

    winrar-x64-561sc解压缩工具

    winrar-x64-561sc解压缩工具

    java源码包2

     Java zip压缩包查看程序,应用弹出文件选择框,选择ZIP格式的压缩文件,可以像Winrar软件一样查看压缩文件内部的文件及文件夹,源码截图如上所示。 Java 数字签名、数字证书生成源码 2个目标文件 摘要:JAVA源码...

    java反编译工具

    请您用WINRAR解压! ║ ║1.后缀名为*.chm、*.exe的电子书,不需安装任何软件即可直阅读。 ║ ║2.后缀名为*.pdf的电子书,需安装Arcobat Reader软件。 ║ ║3.后缀名为*.pdg和*.001,*.002......的电子书,需安装...

    java程序中调用winrar压缩(带密码)

    NULL 博文链接:https://wangleide414.iteye.com/blog/379275

    招聘系统代码 java招聘系统代码

    招聘系统代码 java招聘系统代码 基于springboot的招① 系统环境:Windows/Mac ② 开发语言:Java ③ 框架:SpringBoot ...3、解压说明:本资源需要电脑端使用WinRAR、7zip、Bandizip等解压工具进行解压

    java-unrar-0.3.zip

    java开发解压缩工具包:java-unrar-0.3.jar。 java 解压rar的依赖jar包。不需要安装winrar。

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    Java zip压缩包查看程序源码 1个目标文件 摘要:Java源码,文件操作,压缩包查看 Java zip压缩包查看程序,应用弹出文件选择框,选择ZIP格式的压缩文件,可以像Winrar软件一样查看压缩文件内部的文件及文件夹,源码...

Global site tag (gtag.js) - Google Analytics