gpt4 book ai didi

java - Zlib 压缩过大

转载 作者:行者123 更新时间:2023-12-01 14:16:02 27 4
gpt4 key购买 nike

我对java完全陌生,我决定通过做一个小项目来学习它。我需要使用 zlib 压缩一些字符串并将其写入文件。但是,文件大小太大。这是代码示例:

String input = "yasar\0yasar"; // test input. Input will have null character in it.
byte[] compressed = new byte[100]; // hold compressed content

Deflater compresser = new Deflater();
compresser.setInput(input.getBytes());
compresser.finish();
compresser.deflate(compressed);
File test_file = new File(System.getProperty("user.dir"), "test_file");
try {
if (!test_file.exists()) {
test_file.createNewFile();
}
try (FileOutputStream fos = new FileOutputStream(test_file)) {
fos.write(compressed);
}
} catch (IOException e) {
e.printStackTrace();
}

这里写入一个1KB的文件,而文件最多应该是11字节(因为这里的内容是11字节)。我认为问题在于我初始化压缩为 100 字节的字节数组的方式,但我不知道压缩后的数据有多大。我在这里做错了什么?我该如何修复它?

最佳答案

如果您不想写入整个数组,而是只写入由 Deflater 填充的部分,请使用 OutputStream#write(byte[] array, int offset, int lenght)

差不多

String input = "yasar\0yasar"; // test input. Input will have null character in it.
byte[] compressed = new byte[100]; // hold compressed content

Deflater compresser = new Deflater();
compresser.setInput(input.getBytes());
compresser.finish();
int length = compresser.deflate(compressed);
File test_file = new File(System.getProperty("user.dir"), "test_file");
try {
if (!test_file.exists()) {
test_file.createNewFile();
}
try (FileOutputStream fos = new FileOutputStream(test_file)) {
fos.write(compressed, 0, length); // starting at 0th byte - lenght(-1)
}
} catch (IOException e) {
e.printStackTrace();
}

在 Windows 中您可能仍会看到 1kB 左右,因为您看到的内容似乎是四舍五入的(您之前写入了 100 字节),或者它指的是文件系统上的大小,该大小至少为1 block大(应为 4kb IIRC)。右键单击该文件并检查属性中的大小,这应该显示实际大小。

<小时/>

如果您事先不知道尺寸,请不要使用Deflater,请使用DeflaterOutputStream写入任意长度的压缩数据。

try (OutputStream out = new DeflaterOutputStream(new FileOutputStream(test_file))) {
out.write("hello!".getBytes());
}

上面的示例将使用默认值进行缩减,但您可以在 DeflaterOutputStream 的构造函数中传递配置的 Deflater 来更改行为。

关于java - Zlib 压缩过大,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18100573/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com