Java中zip文件压缩与解压之ZipInputStream和ZipOutputStream
文件压缩 ZipOutputStream
用ZipOutputStream来压缩一个文件夹时,要搭配ZipEntry来使用。ZipEntry是用来创建压缩文件的。
举个例子,向压缩文件中添加一个文件的代码:
//zipOut:压缩文件的路径 ZipOutputStream zipOutputStream = new ZipOutputStream(new FileOutputStream(zipOut)); //zipOutputStream.putNextEntry() ====> 向压缩包中添加一个文件 //new ZipEntry("text1.txt") ======⇒ zip压缩包中文件都是用ZipEntry对象, //"text1.txt"===》是文件在压缩文件的路径,text1.txt表示在压缩文件的根路径 zipOutputStream.putNextEntry(new ZipEntry("text1.txt"));
如下图:
在创建ZipEntry对象时可以指定文件在压缩包的位置:new ZipEntry(“second-dir\second-01.txt”)
在使用ZipOutputStream压缩文件时要注意的地方就是这些,下面给一个压缩文件的代码:
static final int BUFFER_SIZE = 4 << 10; /** * 压缩指定目录下的所有文件 * @param dir 指定压缩目录 * @param destZipName 指定压缩包名字 */ public void zip(String dir,String zipPath,String destZipName) throws IOException { File file = new File(dir); /**1.为zip文件创建目录*****/ String path = file.getParentFile().getAbsolutePath(); if(isNull(destZipName))destZipName = file.getName()+".zip"; if(isNull(zipPath)) zipPath = path; String zipOut = zipPath + File.separator + destZipName; File zipOutFile = new File(zipOut); if(!zipOutFile.getParentFile().exists()){ zipOutFile.getParentFile().mkdirs(); } /**为zip文件创建目录*****/ ZipOutputStream zipOutputStream = new ZipOutputStream(new FileOutputStream(zipOut)); if(!file.isDirectory())zipOutputStream.close(); File[] subFiles = file.listFiles(); for (File subFile : subFiles) { buildZipDir(zipOutputStream,subFile,null); } zipOutputStream.close(); } void buildZipDir(ZipOutputStream zipOut,File file,String baseDir) throws IOException { if(file.isFile()){ String zipEntryName = baseDir == null ? file.getName() : baseDir+File.separator+file.getName(); zipOut.putNextEntry(new ZipEntry(zipEntryName)); byte[] buffer = new byte[BUFFER_SIZE]; try(InputStream inputStream = new FileInputStream(file)){ int len = -1; while((len = inputStream.read(buffer)) != -1){ zipOut.write(buffer,0,len); } zipOut.flush(); zipOut.closeEntry(); } } else{//文件是dir,继续递归找文件 File[] subFiles = file.listFiles(); if(subFiles.length ==0){//处理空文件夹 String zipName = baseDir == null ? file.getName() :baseDir + File.separator+ file.getName() ; zipOut.putNextEntry(new ZipEntry(zipName)); zipOut.closeEntry(); }else{ for (File subFile : subFiles) { String subBaseDir =baseDir == null ? file.getName() :baseDir + File.separator+ file.getName() ; buildZipDir(zipOut,subFile,subBaseDir); } } } } public boolean isNull(String str){ return str == null || str.equals(""); }
测试:
@Test public void testZip() throws IOException { String dir = "D:\\test-zip"; //dir : 要压缩的目录 //D:\\yy\\ 指定压缩文件的位置 //path-test.zip 指定压缩文件的名字 zip(dir,"D:\\yy\\","path-test.zip"); }
文件解压:ZipInputStream
ZipInputStream读取压缩文件,配合ZipFile使用;通过上面的例子,我们知道压缩包里的是一个个ZipEntry对象,在解压时,可以遍历压缩包获取到ZipEntry对象。每一个ZipEntry对象都是一个文件,使用ZipFile可以获取到每一个ZipEntry对象的文件流;获取到文件流就可以将压缩包的文件读出来了。
public void unZip(String zipPath,String unzipPath) throws IOException { File file = new File(zipPath); ZipFile zipFile = new ZipFile(file);//zip文件 ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(file)); if(isNull(unzipPath))unzipPath = zipPath.replace(".zip",""); ZipEntry nextEntry = null; while( (nextEntry = zipInputStream.getNextEntry()) != null){ String name = nextEntry.getName(); String fileOutPath = unzipPath + File.separator + name; File fileOut = new File(fileOutPath); if(!fileOut.getParentFile().exists()){ fileOut.getParentFile().mkdirs(); } if(!fileOut.exists()){ fileOut.createNewFile(); } OutputStream output = new FileOutputStream(fileOutPath); InputStream inputStream = zipFile.getInputStream(nextEntry);//通过ZipFile获取到ZipEntry的文件流 int read = -1; byte[] buffer = new byte[BUFFER_SIZE]; while((read = inputStream.read(buffer) ) != -1){ output.write(buffer,0, read); } output.flush(); output.close(); inputStream.close(); } zipInputStream.close(); zipFile.close(); }
测试:
public void testUnzip() throws IOException { String zip = "D:\\yy\\path-test.zip"; unZip(zip,null); }
总结
到此这篇关于Java中zip文件压缩与解压之ZipInputStream和ZipOutputStream的文章就介绍到这了,更多相关Java zip文件压缩解压内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Java中for、while、do while三种循环语句的区别介绍
这篇文章主要介绍了Java中for、while、do while三种循环语句的区别介绍的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下2016-07-07IDEA的部署设置改为war exploded运行项目出错问题
在使用IDEA配置warexploded部署时,可能会遇到路径问题或404错误,解决方法是进入Deployment设置,删除Application content中的/marry_war_exploded,使其为空,然后重新运行项目即可,这是一种有效的解决策略,希望能帮助到遇到同样问题的开发者2024-10-10springboot项目打包并部署到Tomcat上及报错处理方案
这篇文章主要介绍了springboot项目打包并部署到Tomcat上及报错处理方案,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧2024-08-08
最新评论