Zlib压缩太大了

时间:2013-08-07 10:09:39

标签: java file-io zlib

我是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字节的字节数组初始化,但我不知道预先提取的数据有多大。我在这做错了什么?我该如何解决?

2 个答案:

答案 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);