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

Java压缩与解压缩ZIP文件 小而美的使用JDK自带的ZIP工具包生成与解压缩ZIP文件 阅读详情
 

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");
   }
 


}

Dev-C++ 初学者指南:从零安装到第一个C++程序 集成开发环境(IDE)是程序员编写、调试和运行代码的核心工具,它将编辑器、编译器和调试器集成在一个软件中,极大提升了开发效率。其工作原理是通过统一的图形界面管理源代码,调用底层编译器(如GCC)将高级语言转换为机器码,并利用调试器进行程序逻辑的追踪与错误排查。对于初学者而言,一个配置简单、学习曲线平缓的IDE能有效降低入门门槛,将注意力集中在编程语法和算法逻辑本身。在众多IDE中,Dev-C++因其极致的轻量化和“开箱即用”的特性,成为C/C++语言入门教学的经典选择。它内置了完整的GCC编译工具链,无需复 阅读详情

相关推荐

利用ZipInputStream(解压)/ZipOutputStream(压缩)文件夹

在操作.zip的压缩包时,可以用到高级流ZipInputStream和ZipOutputStream。.zip文件中的每个文件夹文件都是一个ZipEntry对象。解压和压缩的本质就是操作每个ZipEntry对象,只能操作后缀为.zip的文件

contact97的博客 2868

Java基础之115 116 压缩与解压

java中实现zip的压缩与解压ZipOutputStream 实现文件的压缩 ZipOutputStream(OutputStream out) 创建新的 ZIP 输出流。 void putNextEntry(ZipEntry e) 开始写入新的 ZIP 文件条目并将流定位到条目数据的开始处。 ZipEntry(String name) //test/mm.jpg /test/a.t...

C_time的博客 517

Java的zip文件压缩与解压:ZipInputStream,ZipOutputStream

通过上面的例子,我们知道压缩包里的是一个个ZipEntry对象,在解压时,可以遍历压缩包获取到ZipEntry对象。每一个ZipEntry对象都是一个文件,使用ZipFile可以获取到每一个ZipEntry对象的文件流;获取到文件流就可以将压缩包的文件读出来了。在创建ZipEntry对象时可以指定文件在压缩包的位置:new ZipEntry(“second-dir\second-01.txt”)用ZipOutputStream来压缩一个文件夹时,要搭配ZipEntry来使用。

Myd 1万+

使用Java解压和压缩文件

Java中,你可以使用java.util.zip包来实现解压和压缩文件。这个包提供了对ZIP格式的文件进行压缩和解压的功能。

境里婆娑 1423

初学C++编写的代码积累

1:打印字符图像#include#includeusing namespace std;int main(){  string Space_Array="         ";//定义9个空格,作为一个单位,然后截取    string Sign_Array="*******************";//19个*,然后截取    int Num1=9; //空格段的最大值Space_Array.

kai_top的专栏 1435

关于自己初学c++积累的笔记

关于自己初学c++积累的笔记 /* //演示单精度浮点型和双精度浮点型精度问题 cout<< fixed ;//让浮点型固定以数字的方式显示 cout<<setprecision(2); //控制显示的小数位数 cin >> num ; //scanf ("%d",&num); setw( )是设置宽度 但只管后面的 例如:cout<< se...

Go1ng的博客 271

C++主题年技巧积累#1——UltraEdit的代码美化

 C++主题年技巧积累#1——UltraEdit的代码美化CSDN旗下水之真谛(http://blog.csdn.net/FantasiaX)出品小序:         最近这些天总有朋友问我怎么不写C#的东西了,呵呵,是这样的——今年的年度计划中我把“年度技术主题”定为了C++语言,所以学习的内容就偏重C++了——显然,去年的主题是C#。当然啦,温故可以知新,所以我也会时常对照着

jiangxinyu的专栏 1443

C++初学者该如何写程序?

前序 转眼一年多未写过博客了(工作太忙了),最近一直在思考一个问题,如果要写博客该写什么好?若想写的东西多可却很杂,那好像并没什么用。要不写个系列吧?那从哪里开始呢?要不从初学开始吧? 初学篇 未接触过编程前,大多数人都会觉得学了就可以什么都能干了,(可能很多程序员都有过少的经历, 朋友们可能会问你会黑别人电脑吗,当过黑客吗? 不会! 那你会修电脑吗? 也不会!) 其实程序员不是这样的没有...

佛系程序猿 1992

怎么在博客上积累代码量?

【来信】   贺老师,您好!请问怎么在博客上积累代码量呢?我在用博客,也尝试着写些东西,但是不知道怎么弄。希望您能指点一下迷津。【回复】   我的学生是将要作业发布为博客。而对于你,可以是写一个程序,就发一篇博文,不必刻意地为了发博文而写什么。从这个意义上讲,关键的是,将自己的实践进行下去,顺便地,博文就有了,代码的积累也就看出来了。不必因为自己写得“简单”而不去做这件事,保证自己认真对待过,你

迂者-贺利坚的专栏 3642

朋友们,技术需要积累

朋友们,特别是大学的朋友们,技术需要积累。        刚学计算机的时候,是从c语言开始的,那时候只会编写一些简单的程序,就感觉很满足。感觉满足,是因为我只活在自己小小的世界里,从来没有去外面探索过。到了后来,才渐渐地发现原来自己是个渣渣,学校的c语言题目,对于很多人来说,那是塞牙缝都不够。渐渐地又认识了很多技术流的朋友,加上自己在网上逛博客之的东西,才认识到,计算机,好难啊!网上各种牛人都

Not just a Geek 808

踏上C++游戏开发之旅:初学者指南与实战代码

学习C++游戏开发是一个既充满挑战又极具回报的过程。通过掌握C++基础知识、学习游戏开发概念、选择合适的游戏引擎、动手实践项目以及深入学习和参与社区,你将能够逐步构建自己的游戏开发技能。记住,实践是学习的关键,不断尝试新的想法和技术,你的游戏开发之旅将会充满乐趣和成就感。

2401_85342379的博客 1807

从理论到实践:如何通过CPP-Crash-Course快速掌握C++编程技巧

**CPP-Crash-Course**是一个专为C程序员设计的C++快速入门教程项目,提供从基础语法到高级特性的完整学习路径。这个开源项目通过实用的代码示例和清晰的解释,帮助开发者快速从C语言过渡到现代C++编程,掌握面向对象编程、模板、异常处理等核心概念。无论你是刚接触C++的新手,还是希望系统复习C++知识的开发者,这个项目都能为你提供有价值的参考。 ## 📚 项目概述与核心价值 CP

gitblog_00617的博客 486

C++操作积累

weixin_43332626的博客 723

QT C++ 自学积累 『非技术文』

最近一段时间参与了一个 QT 项目的开发,使用的是 C++ 语法,很遗憾的是我之前从来没有接触过 C++ ,大学没有开过这堂课,也没用自己学习过,所有说上手贼慢,到现在为止其实也不是很清楚具体的开发技巧,毕竟是参与,东一复制西一粘贴的,就拉倒了。里面用到了很多东西,尽管很简单很简单,但是对于没有接触过的人来说还是很值得记录一下的,这篇博文只是自己学习记录,没啥营养,浅看则以,切勿尽信!对了,用的 QT5 哈,其他版本的不知道嗷!

“跟他人学,和自己比” 1004

简单编程代码_学习C/C++的简单方法

如何学习C++呢。C和C++是很多专业的必修课,尤其对计算机专业来说,更是重中之重。C++语言是早期发展的高级语言,具备执行速度快,语法优美等特点。是底层高效率系统的首选开发语言。今天就和大家分享一下怎么学好C/C++语言吧 _怎么学好C++、C语言呢工具/原料C/C++学习资料浓厚的兴趣持之以恒的态度方法/步骤1找一本好的书本教材,辅助看教学视频好的教材,可以让你更快更好的进入C/C++的世界。...

weixin_39928233的博客 2085

C++入门知识点总结(上篇·初学必看)

C++入门知识点详细总结,初学者也能看懂哦!

m0_74475605的博客 1299

怎样学习C++

在编程的这篇天空,有一句话流传已久:真正的程序员使用C++。 当你进入本网站,这意味着你的C++编程之旅已经迈出第一步。中国有句老话,叫“万事开头难”。如果你是一个新手,刚开始会遇到不少困难,此时一定要提醒自己,不要放弃,不要浮躁。有志者浑身是胆,有志者万事竞成。 现在,让我们拨开迷雾,奋勇前行吧。 C++是一门高级编程语言,它是在C语言基础上发展起来的。在众多编程语言中,C++被认为是最难

wave12_sg的专栏 2334
上一篇: 获取服务进程id
下一篇: 飞鸽传书for linux
beyond429
博客等级 码龄22年 10粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值