使用zip4j生成的ZIP文件内所有文件大小均为0的问题求助
解决zip4j生成ZIP文件内容为空(0字节)的问题
嘿,我之前也踩过这个坑!你遇到的所有文件大小为0的问题,核心原因是没有把源文件的实际内容写入到ZIP归档中——虽然你配置了压缩参数、创建了输出流,但归档里只生成了文件的条目结构,没有真正写入数据。
下面给你两种解决方案,优先推荐第一种,更简洁不易出错:
方案1:使用zip4j推荐的ZipFile类(官方标准用法)
zip4j设计了更易用的ZipFile封装类,会自动帮你处理文件读取、写入的细节,不用手动管理流操作。示例代码如下:
File zipFile = new File(zipName); ZipParameters params = new ZipParameters(); params.setCompressionMethod(Zip4jConstants.COMP_DEFLATE); params.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL); // 初始化ZipFile实例 ZipFile zip = new ZipFile(zipFile); // 添加单个文件(如果要添加多个,循环调用addFile即可) File sourceFile = new File("你的源文件绝对路径"); zip.addFile(sourceFile, params); // 如果需要添加文件夹,用addFolder方法 // zip.addFolder(new File("你的文件夹路径"), params);
这种方式不需要你手动处理流的读写,zip4j会自动完成所有步骤,生成的ZIP文件会包含完整的文件内容。
方案2:补全ZipOutputStream的流操作(如果你坚持用这个方式)
如果一定要用ZipOutputStream,你需要手动完成写入条目信息、读取源文件内容、写入流、关闭条目这几个关键步骤,补全后的代码示例:
File zipFile = new File(zipName); ZipParameters params = new ZipParameters(); params.setCompressionMethod(Zip4jConstants.COMP_DEFLATE); params.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL); byte[] buffer = new byte[8192]; // 假设要添加的源文件是sourceFile File sourceFile = new File("源文件的路径"); // 必须设置归档内的文件名,否则条目会异常 params.setFileNameInZip(sourceFile.getName()); try (ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFile)); FileInputStream in = new FileInputStream(sourceFile)) { // 先写入当前文件的条目信息 out.putNextEntry(params); // 循环读取源文件内容并写入ZIP输出流 int readLen; while ((readLen = in.read(buffer)) != -1) { out.write(buffer, 0, readLen); } // 关闭当前条目,完成这个文件的写入 out.closeEntry(); } catch (IOException e) { e.printStackTrace(); }
你之前的代码应该是缺失了putNextEntry、内容写入和closeEntry这些步骤,导致ZIP里只有空的文件条目,没有实际数据。
内容的提问来源于stack exchange,提问作者Ellrohir
相关产品推荐
相关产品推荐

