我是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();
}
这写一个1千字节的文件,而文件最多应该是11个字节(因为这里的内容是11个字节)。我认为问题在于我将压缩为100字节的字节数组初始化,但我不知道预先提取的数据有多大。我在这做错了什么?我该如何解决?
答案 0 :(得分:1)
如果您不想编写整个数组,而只是编写由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 {{ 3}}大(应该是4kb IIRC)。右键单击文件并检查属性中的大小,该大小应显示实际大小。
如果您事先不知道尺寸,请不要使用Deflater
,请使用写入任意长度数据的block。
try (OutputStream out = new DeflaterOutputStream(new FileOutputStream(test_file))) {
out.write("hello!".getBytes());
}
上面的示例将使用默认值进行缩小,但您可以在Deflater
的构造函数中传递已配置的DeflaterOutputStream
来更改行为。
答案 1 :(得分:0)
你写入compressed
数组的所有100个字节的文件,但是你必须只写出deflater返回的真正压缩的字节。
int compressedsize = compresser.deflate(compressed);
fos.write(compressed, 0, compressedsize);