Java Zlib压缩的大小太大

Java Zlib压缩的大小太大,java,file-io,zlib,Java,File Io,Zlib,我对java完全陌生,我决定通过在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 = n

我对java完全陌生,我决定通过在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
填充的部分,请使用

大致相同

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大的大小(应该是4kb IIRC)。右键单击该文件并在属性中检查大小,该属性应显示实际大小


如果您事先不知道大小,请不要使用
Deflater
,请使用可写入任何长度压缩数据的

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

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

您将
压缩的
数组的所有100字节写入文件,但您必须只写入Deflater返回的真正压缩的字节。
int compressedsize=压缩机。放气(压缩)

fos.write(压缩,0,压缩大小)

使用
resultLength
。@zapl在压缩完成后给出压缩数据的长度。我需要在初始化之前初始化输出数组,否则会出现错误:
变量compressed可能尚未初始化
@HighPerformanceMark我不确定如何检查。我在windows 7(64位)上,第一部分接受+1,输出流接受+1;)流通常更易于使用,您可以将它们插入到一起,例如,写入先加密,然后压缩的数据,然后可能是通过在流中包装流而编码的BASE64之类的其他数据。