A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 小歪 于 2014-3-27 12:20 编辑

文件夹压缩以及解压缩

任务要求      利用Java代码,将 F盘下的 itheima文件夹以及子文件 压缩为 *.zip 格式,并命名为 黑马程序员





代码如下:
  1. import java.io.File;
  2. import java.io.FileOutputStream;
  3. import java.io.InputStream;
  4. import java.util.zip.ZipEntry;
  5. import java.util.zip.ZipOutputStream;
  6. import java.io.FileInputStream;

  7. public class ZipFileTest {
  8.         public static void main(String args[])throws Exception   //所有异常抛出
  9.         {
  10.                 File file=new File("F:"+File.separator+"itheima");     //定义        所要压缩文件路径
  11.                 File zipFile=new File("F:"+File.separator+"黑马程序员.zip");     //定义        文件夹压缩后路径以及名称
  12.                 InputStream input=null;       //定义文件输入流
  13.                 ZipOutputStream zipOut=null;        //定义压缩文件输出流
  14.                 zipOut=new ZipOutputStream(new FileOutputStream(zipFile));
  15.                
  16.                 zipOut.setComment("<www.itheima.com>");     //设置压缩文件注释
  17.                
  18.                 if(file.isDirectory())      //判断是否是路径 (及文件夹)
  19.                 {
  20.                         File lists[]=file.listFiles();       //列出全部文件
  21.                         
  22.                         for(int i=0;i<lists.length;i++)     //分别对文件夹内文件进行压缩
  23.                         {
  24.                                 input =new FileInputStream(lists[i]);     //重复设置文件输入流
  25.                                 
  26.                                 //每个被压缩的文件都用ZipEntry表示,需要为每个压缩后文件设置名称
  27.                                 zipOut.putNextEntry(new ZipEntry(file.getName()+File.separator+lists[i].getName()));
  28.                                 int temp=0;
  29.                                 while((temp=input.read())!=-1)      //直到文件内容读取完停止循环
  30.                                 {
  31.                                         zipOut.write(temp);
  32.                                 }
  33.                                 input.close();      //关闭输入流
  34.                         }
  35.                 }
  36.                 zipOut.close();  //关闭压缩输出流
  37.         }
  38. }
复制代码

运行结果:





压缩文件中内容也没有问题:




小结:以上代码将itheima文件夹的内容压缩为 “黑马程序员.zip” 文件。程序首先判断给定的路径是否正确,如果文件夹存在,则将此文件夹中的所有内容使用  listFiles()方法全部列出,此方法返回File的对象数组,然后将此File对象数组中每个文件进行压缩,每次压缩时都要设置一个新的 ZipEntry对象。

----------------------------------------(囧) (囧)(囧)我是无奈的分隔符(囧)(囧)(囧)-------------------------------------


                      那么,既然Java可以将文件夹打成压缩包,自然也可以解压文件喽    :hug: :hug: :hug: :hug: :hug: :hug: :hug: :hug:  
:hug: :hug:  :hug:  :hug:  :hug:  :hug:  :hug:  :hug: 接下来我们就将上图中的“黑马程序员.zip” 压缩文件进行解压操作
                  (~~~~~~~将““黑马程序员.zip”压缩文件解压  到D盘(为了与原文件区分开)~~~~~~~~)
代码如下:
  1. import java.io.File;
  2. import java.io.FileInputStream;
  3. import java.io.FileOutputStream;
  4. import java.io.InputStream;
  5. import java.io.OutputStream;
  6. import java.util.zip.ZipEntry;
  7. import java.util.zip.ZipFile;
  8. import java.util.zip.ZipInputStream;


  9. public class UnZipFileTest {
  10.         public static void main(String args[])throws Exception  //为了代码清晰度,暂时抛出所有异常
  11.         {
  12.                 File file=new File("F:"+File.separator+"黑马程序员.zip"); //找到需要进行解压缩的文件
  13.                 File outFile=null;                //现定义好用于输出的文件对象
  14.                 ZipFile zipFile=new ZipFile(file); //实例化ZipFile对象
  15.                 ZipInputStream zipInput=new ZipInputStream(new FileInputStream(file)); //实例化ZIP输入流
  16.                 ZipEntry entry=null;        //定义一个ZipEntry对象,用于接受压缩文件中的每一个实体(即:文件)
  17.                 InputStream input=null;        //定义输入流,用于读取当前文件(entry)中的内容
  18.                 OutputStream output=null;  //定义输出流,将读取到的文件内容输出到另一个文件中
  19.                 int i=0;
  20.                
  21.                 while((entry=zipInput.getNextEntry())!=null)        //获得压缩文件夹中的子文件,直到末尾结束
  22.                 {
  23.                         System.out.println("子文件"+(++i)+":  "+entry.getName()); //测试下是否获得子文件
  24.                         outFile=new File("D:"+File.separator+entry.getName()); //实例化输出文件
  25.                         
  26.                         if( !(outFile.getParentFile().exists()) ) //判断当前文件的父文件(即:文件夹)是否存在 ,不存在则需要创建,存在则直接解压
  27.                         {
  28.                                 outFile.getParentFile().mkdir();        //创建文件夹
  29.                         }
  30.                         
  31.                         if(!(outFile.exists()))  //判断文件是否存在,不存在则创建,存在则写入
  32.                         {
  33.                                 outFile.createNewFile(); //创建文件
  34.                         }
  35.                         
  36.                         input=zipFile.getInputStream(entry); //得到压缩文件的输入流
  37.                         output=new FileOutputStream(outFile);  //实例化输出流对象(用于写入文件内容)
  38.                         int temp=0;
  39.                         while((temp=input.read())!=-1) //开始读取当前文件中内容,直到文件末尾
  40.                         {
  41.                                 output.write(temp); //写入压缩后文件
  42.                         }
  43.                         input.close();
  44.                         output.close();   
  45.                         //关闭输入、输出流
  46.                 }
  47.         }
  48. }
复制代码

让我们看看运行结果:






让我们再来看看D盘:


当然内部文件也没有问题:





小结 :以上程序是将F盘中 “黑马程序员.zip”压缩文件解压到D盘根目录,首先使用ZipInputStream读取zip格式文件,然后通过getNextEntry()方法依次读取其中的每个ZipEntry对象(即:子文件),并通过ZipFile类取得每个ZipEntry的输入流对象,并在进行文件输出前,判断下输出文件及父文件是否存在,如果不存在则需要创建。

评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

5 个回复

倒序浏览
好牛。。。。
回复 使用道具 举报
楼主好牛!佩服!
回复 使用道具 举报
长知识了.............原来压缩文件包zip等也可以简单看着一个文件对象,找时间琢磨琢磨,以及也研究下压缩率的问题。
回复 使用道具 举报
厉害,学习了!!!
回复 使用道具 举报
我的运行的时候出现系统找不到路径异常,是不是编码什么的有问题
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马