架构师_程序员

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 186|回复: 1

[资料] java 用zipInputStream 解压嵌套文件 (含空文件夹)

[复制链接]
跳转到指定楼层
楼主
发表于 2019-7-5 10:41:48
zu
注意:

用zipEntry.isDirectory()判断是否文件夹是,根据源代码,只能判断以 / 结尾的,不能识别以 \ 结尾的

代码如下:输入解压路径和压缩文件名(带路径的,如 D:/test.zip)
  1. import java.io.*;
  2. import java.util.zip.ZipEntry;
  3. import java.util.zip.ZipFile;
  4. import java.util.zip.ZipInputStream;
  5. import java.util.zip.ZipOutputStream;

  6.       /**
  7.      * author lyh
  8.      */
  9. public class ZIPTest1 {


  10.     public static void main(String args[]) {
  11.         ZIPTest1 zipTest1 = new ZIPTest1();
  12.         try{
  13.             zipTest1.Decompress("D:/ZipTest2/","D:/ZipTest.zip");
  14.         }catch (Exception e){
  15.             e.printStackTrace();
  16.         }
  17.     }

  18.     /**
  19.      * 解压文件到指定目录
  20.     * @param targetPath 需要解压地址
  21.     * @param zipFilePath 压缩文件的名字(含路径 如D:/ZipTest.zip)
  22.      */
  23.     private void Decompress(String targetPath,String zipFilePath){
  24.         File file = new File(zipFilePath);
  25.         ZipInputStream zipInputStream ;
  26.         try {
  27.             ZipFile zipFile = new ZipFile(file);
  28.             zipInputStream= new ZipInputStream(new FileInputStream(file));
  29.             ZipEntry zipEntry = zipInputStream.getNextEntry();
  30.             while(zipEntry != null){
  31. //              if (zipEntry.isDirectory()){  //这样有可能是\结尾 导致空文件夹判断不了
  32.                 if (zipEntry.getName().endsWith("/") || zipEntry.getName().endsWith("\")){
  33.                     File dir = new File(targetPath +
  34.                     zipEntry.getName().substring(0,zipEntry.getName().length()-1));//空文件的结尾带/
  35.                     if (!dir.exists()){
  36.                         dir.mkdirs();
  37.                     }
  38.                 }else {
  39.                     DecompressFile(targetPath,zipEntry,zipFile);
  40.                 }
  41.                 zipInputStream.closeEntry();
  42.                 zipEntry = zipInputStream.getNextEntry();
  43.             }
  44.             zipInputStream.close();
  45.         }catch (Exception e){
  46.             e.printStackTrace();
  47.         }
  48.     }

  49.     /**
  50.      * 解压单个文件(非文件夹)
  51.      * targetPath 需要解压地址
  52.      * zipFilePath 压缩文件的名字(含路径 如D:/ZipTest.zip)
  53.      */
  54.     private void DecompressFile(String targetPath,ZipEntry zipEntry,ZipFile zipFile)throws Exception{
  55.         File tmp = new File(targetPath+zipEntry.getName());
  56.         if (!tmp.exists()){  //先判断父路径是否存在
  57.             tmp.getParentFile().mkdirs();
  58.             OutputStream outputStream = new FileOutputStream(tmp);  //输出流生成新文件
  59.             InputStream inputStream = zipFile.getInputStream(zipEntry); //输入流读取Zip文件

  60.             byte bytes[]=new byte[1024];
  61.             int n=0;
  62.             while((n=inputStream.read(bytes))!= -1){
  63.                 String str = new String(bytes,0,n);
  64.                 outputStream.write(n);
  65.             }
  66.             outputStream.close();
  67.             inputStream.close();
  68.         }
  69.     }


  70. }
复制代码






上一篇:ubuntu vsftpd 530 Login incorrect 根本原因和解决方案
下一篇:CentOS7 查看和关闭防火墙
帖子永久地址: 

架构师_程序员 - 论坛版权1、本主题所有言论和图片纯属会员个人意见,与本论坛立场无关
2、本站所有主题由该帖子作者发表,该帖子作者与架构师_程序员享有帖子相关版权
3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和架构师_程序员的同意
4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
7、架构师_程序员管理员和版主有权不事先通知发贴者而删除本文

码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
沙发
 楼主| 发表于 2019-7-5 10:47:59
  1. package test;

  2. import java.io.*;
  3. import java.util.zip.ZipEntry;
  4. import java.util.zip.ZipInputStream;
  5. import java.util.zip.ZipOutputStream;

  6. public class Test4 {
  7.     void putTxtFile(ZipOutputStream out,String name) throws IOException{
  8.         ZipEntry zipEntry=new ZipEntry(name);
  9.         out.putNextEntry(zipEntry);
  10.         out.write("this is a demo txt".getBytes());
  11.         out.closeEntry();
  12.     }
  13.     void testOut(String fileName) throws IOException {
  14.         ZipOutputStream out=new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(fileName)));
  15.         putTxtFile(out,"test/demo.txt");
  16.         putTxtFile(out,"demo.txt");
  17.         putTxtFile(out,"test2/demo.txt");
  18.         out.close();
  19.     }
  20.     void readTxtFile(ZipInputStream in, ZipEntry entry, String outDir) throws IOException {

  21.         byte [] buff=new byte[512];
  22.         int len=0;
  23.         File file=new File(outDir,entry.getName());
  24.         if(!file.getParentFile().exists()){
  25.             file.getParentFile().mkdirs();
  26.         }
  27.         BufferedOutputStream out=new BufferedOutputStream(new FileOutputStream(file));
  28.         while ((len=in.read(buff,0,buff.length))!=-1){
  29.             System.out.print(new String(buff,0,len));
  30.             out.write(buff,0,len);
  31.         }
  32.         System.out.println();
  33.         out.close();
  34.     }
  35.     void testIn(String fileName,String outDir) throws IOException{
  36.         ZipInputStream in=new ZipInputStream(new BufferedInputStream(new FileInputStream(fileName)));
  37.         ZipEntry entry=null;
  38.         while ((entry=in.getNextEntry())!=null){
  39.             System.out.println(entry.isDirectory()?"目录":"文件"+":"+entry.getName());
  40.             if(entry.isDirectory()){
  41.                 new File(outDir,entry.getName()).mkdirs();
  42.             }else{
  43.                 readTxtFile(in,entry,outDir);
  44.             }
  45.             in.closeEntry();
  46.         }
  47.         in.close();
  48.     }
  49.     public static void main(String[] args) throws IOException {

  50.         Test4 test4=new Test4();
  51.         String fileName="demo.zip";
  52.         test4.testOut(fileName);

  53.         test4.testIn(fileName,"testOut");


  54.     }
  55. }
复制代码
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。

Mail To:help@itsvse.com

QQ|Archiver|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2019-9-17 17:05

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表