(Java控制台程序版)递归打包整个父文件夹下的文件和子文件夹成压缩文件(*.ZIP)以及打包时常见的文件乱码和文件名乱码以及丢失文件或文件损坏问题解决办法

来源:互联网 发布:网络诈骗罪的立案金额 编辑:程序博客网 时间:2024/05/21 19:31

(Java控制台程序版)

      web版:(java)多个附件打包成压缩文件(*.ZIP)以及打包时常见的文件乱码和文件名乱码以及丢失文件或文件损坏问题解决办法(WEB版)


常见错误解决办法: 

压缩包的某些文件损坏解决办法:一定要及时的清空和关闭 (zos.flush();zos.close();),否则会导致压缩包的某些文件损坏

丢失中文文件名解决办法: fileName = new String(fileName.getBytes(),"ISO-8859-1"); // 对文件名中文转码

还有一种情况,就是下载下来的压缩包内缺少文件,明明打包了3个文件,下载下来却只有2个或者1个,那是因为常用的压缩软件WinRAR会自动过滤掉0kb 的文件,可以使用360压缩打开,即可看到被WinRAR过滤掉的0kb文件。

完整代码:
package com.audit.zip;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.util.zip.ZipEntry;import java.util.zip.ZipOutputStream;/** * 文件夹打包 * @author by Zxy * 2017-7-18 <br> 上午11:40:22 */public class PackageZip {public static void main(String[] args) {packageZip("F:/OwO/testFiles/imgs/","C:/Users/space/Desktop/newFile/test.zip");}/** * 文件夹打包 * by Zxy <br> 2017-7-18 <br> 上午11:44:48 * @param sourcePath 需要打包的文件路径 * @param createZipPath 压缩包生成的路径(包含文件名) */public static void packageZip(String sourcePath, String createZipPath) {FileOutputStream fos = null;ZipOutputStream zos = null;try {fos = new FileOutputStream(createZipPath);zos = new ZipOutputStream(fos);writeZos(new File(sourcePath),"",zos);System.out.println("success");} catch (Exception e) {e.printStackTrace();System.out.println("error");}finally {try {if (zos != null) {zos.close();}if (fos != null) {fos.close();}} catch (Exception e) {e.printStackTrace();}}}/** *  * by Zxy <br> 2017-7-18 <br> 上午11:47:40 * @param file 需要打包的文件/文件目录 * @param parentPath 父路径 * @param zos Zip 输出流 */public static void writeZos(File file, String parentPath, ZipOutputStream zos) {// 判断文件是否存在if (!file.exists()) { System.out.println("文件不存在");}// 如果是目录,那就递归查询该目录下的所有文件if (file.isDirectory()) {parentPath = file.getName() + File.separator; // File.separator = '/'System.out.println("parentPath>>>>" + parentPath);File[] listFiles = file.listFiles(); // 文件列表/* 如果不是空目录,那就递归文件夹 */if (listFiles.length != 0) {for (int i = 0; i < listFiles.length; i++) {writeZos(listFiles[i], parentPath, zos);}}/* 如果是空目录,那就为当前目录创建一个子目录 */else {try {zos.putNextEntry(new ZipEntry(parentPath));} catch (IOException e) {e.printStackTrace();}}}/* 如果是文件,就把这个文件进行打包。 * 原理:先创建*.zip压缩包,然后发现一个文件就写进去一个,直到写完为止, * ZipEntry 可以当成压缩包内的一个实体文件,只要 zos 流不关闭,就一直可以写不同路径下的文件到压缩包内。  */else {try {ZipEntry entry = new ZipEntry(parentPath + file.getName());zos.putNextEntry(entry);int length = 0;byte[] fileByte = new byte[1024];FileInputStream fis = new FileInputStream(file);while( (length = fis.read(fileByte)) != -1 ) {zos.write(fileByte,0,length);zos.flush();}} catch (Exception e) {e.printStackTrace();}}}}


-END-

阅读全文
0 0