使用 Java 压缩 CSV 文件会生成字节数较少的压缩文件
Zipping CSV file using Java produces zip file with lesser bytes
我有一个简单的 Java 代码,它使用一个 CSV 文件创建一个 ZIP 文件。代码运行良好,生成的 zip 文件恰到好处。但是,zip 文件大小(字节)与我使用 Windows 压缩工具或类似 7zip 创建的文件不同。我需要知道是否有任何 Java 库可以创建类似于 windows 压缩文件的方式的 zip 文件。
背景 - 我们将这个 zip 文件发送到 REST API,它有时会因 403 - 禁止错误而失败,但是当我们使用 windows zipper 或 7zip 压缩文件时,它工作正常。所以,我想知道是否有任何方法可以像 windows/7zip 那样在 Java 中压缩文件。
我试过了 -
- 用于压缩的内置 Java 函数
- Apache 公共压缩
- zip4j
例如
Map<String, String> env = new HashMap<>();
// Create the zip file if it doesn't exist
env.put("create", "true");
URI uri = URI.create("jar:file:/C:/temp/test.zip");
try (FileSystem zipfs = FileSystems.newFileSystem(uri, env)) {
Path externalTxtFile = Paths.get("C:/temp/test.csv");
Path pathInZipfile = zipfs.getPath("/test.csv");
// Copy a file into the zip file
Files.copy(externalTxtFile, pathInZipfile, StandardCopyOption.REPLACE_EXISTING);
}
PS。我们仍在等待来自 API 提供商的堆栈跟踪详细信息,但与此同时,我正在寻找可以生成由 OS 生成的 zip 文件的精确副本的东西,例如Windows 拉链。
更新
我尝试将压缩级别设置为 1、2、3、4、5,它适用于所有这些。我尝试设置 7、8、9 它再次起作用。但是对于压缩级别 6,它失败了。知道可能是什么原因吗?我的代码在 Unix OS 上运行,所以我相信 6 是默认级别。但不知道压缩率会如何影响这里。
FileOutputStream fout = new FileOutputStream("C:\temp\productcost.zip");
ZipOutputStream zout = new ZipOutputStream(output);
zout.setLevel(5); //1,2,3,4,5,7,8,9 works Level 6 - Fails with 403 Forbidden
Path file = Paths.get("C:\temp\productcost.csv");
byte[] bytes = Files.readAllBytes(file);
ZipEntry ze = new ZipEntry("productcost.csv");
zout.putNextEntry(ze);
zout.write(bytes, 0, bytes.length);
zout.closeEntry();
zout.finish();
zout.flush();
zout.close();
此外,如果我从 CSV 文件中删除第一个字符或在开头手动添加一个字符,该文件在没有任何级别设置的情况下工作正常。我在文件中没有看到任何 BOM 字符。
您实际上并不是在创建一个 zip 文件,您是在创建一个扩展名为 .zip
的文件,并简单地将原始 CSV 文件值复制到其中。
要在 Java 中创建 zip,您可以按照 this tutorial
有一个带有端点 API 的 bug/issue 无法解压缩一些默认压缩级别为 6 的压缩文件。相同的文件正在使用任何其他压缩级别进行处理。由于我们不拥有它,因此我们不知道他们到底修复了什么。但是,现在一切正常。如果我收到 API 供应商的回复,将更新此答案。
我有一个简单的 Java 代码,它使用一个 CSV 文件创建一个 ZIP 文件。代码运行良好,生成的 zip 文件恰到好处。但是,zip 文件大小(字节)与我使用 Windows 压缩工具或类似 7zip 创建的文件不同。我需要知道是否有任何 Java 库可以创建类似于 windows 压缩文件的方式的 zip 文件。
背景 - 我们将这个 zip 文件发送到 REST API,它有时会因 403 - 禁止错误而失败,但是当我们使用 windows zipper 或 7zip 压缩文件时,它工作正常。所以,我想知道是否有任何方法可以像 windows/7zip 那样在 Java 中压缩文件。
我试过了 -
- 用于压缩的内置 Java 函数
- Apache 公共压缩
- zip4j
例如
Map<String, String> env = new HashMap<>();
// Create the zip file if it doesn't exist
env.put("create", "true");
URI uri = URI.create("jar:file:/C:/temp/test.zip");
try (FileSystem zipfs = FileSystems.newFileSystem(uri, env)) {
Path externalTxtFile = Paths.get("C:/temp/test.csv");
Path pathInZipfile = zipfs.getPath("/test.csv");
// Copy a file into the zip file
Files.copy(externalTxtFile, pathInZipfile, StandardCopyOption.REPLACE_EXISTING);
}
PS。我们仍在等待来自 API 提供商的堆栈跟踪详细信息,但与此同时,我正在寻找可以生成由 OS 生成的 zip 文件的精确副本的东西,例如Windows 拉链。
更新 我尝试将压缩级别设置为 1、2、3、4、5,它适用于所有这些。我尝试设置 7、8、9 它再次起作用。但是对于压缩级别 6,它失败了。知道可能是什么原因吗?我的代码在 Unix OS 上运行,所以我相信 6 是默认级别。但不知道压缩率会如何影响这里。
FileOutputStream fout = new FileOutputStream("C:\temp\productcost.zip");
ZipOutputStream zout = new ZipOutputStream(output);
zout.setLevel(5); //1,2,3,4,5,7,8,9 works Level 6 - Fails with 403 Forbidden
Path file = Paths.get("C:\temp\productcost.csv");
byte[] bytes = Files.readAllBytes(file);
ZipEntry ze = new ZipEntry("productcost.csv");
zout.putNextEntry(ze);
zout.write(bytes, 0, bytes.length);
zout.closeEntry();
zout.finish();
zout.flush();
zout.close();
此外,如果我从 CSV 文件中删除第一个字符或在开头手动添加一个字符,该文件在没有任何级别设置的情况下工作正常。我在文件中没有看到任何 BOM 字符。
您实际上并不是在创建一个 zip 文件,您是在创建一个扩展名为 .zip
的文件,并简单地将原始 CSV 文件值复制到其中。
要在 Java 中创建 zip,您可以按照 this tutorial
有一个带有端点 API 的 bug/issue 无法解压缩一些默认压缩级别为 6 的压缩文件。相同的文件正在使用任何其他压缩级别进行处理。由于我们不拥有它,因此我们不知道他们到底修复了什么。但是,现在一切正常。如果我收到 API 供应商的回复,将更新此答案。