我有以下两个代码块,我用它来压缩一个字符串。不同的行为当返回的地方内部和尝试后
代码1
public static String compressResponse(String response) throws IOException {
Deflater deflater = new Deflater(Deflater.DEFLATED, true);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
DeflaterOutputStream deflaterOutputStream = new DeflaterOutputStream(byteArrayOutputStream, deflater);
try {
deflaterOutputStream.write(response.getBytes(StandardCharsets.UTF_8));
return Base64.encodeBytes(byteArrayOutputStream.toByteArray(), Base64.DONT_BREAK_LINES);
} finally {
deflaterOutputStream.close();
}
}
代码2
public static String compressResponse(String response) throws IOException {
Deflater deflater = new Deflater(Deflater.DEFLATED, true);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
DeflaterOutputStream deflaterOutputStream = new DeflaterOutputStream(byteArrayOutputStream, deflater);
try {
deflaterOutputStream.write(response.getBytes(StandardCharsets.UTF_8));
} finally {
deflaterOutputStream.close();
}
return Base64.encodeBytes(byteArrayOutputStream.toByteArray(), Base64.DONT_BREAK_LINES);
}
只有第二方法正常工作,其中第一方法总是返回空字符串。我知道这种不同的行为是由于不同的返回块相对于finally块的放置而发生的。这是什么确切的行为?
的['close'的Javadoc](https://docs.oracle.com/javase/8/docs/api/java/util/ zip/DeflaterOutputStream.html#close--)表示*将剩余的压缩数据写入输出流并关闭底层流*。据推测,如果你没有关闭,剩下的*数据(即全部)还没有被写入流中(另见['flush'](https://docs.oracle.com/) JavaSE的/ 8 /文档/ API/JAVA/util的/压缩/ DeflaterOutputStream.html#flush--))。另外,我更喜欢['try-with-resources'](http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html)。 –
@ElliottFrisch“*还有其他数据(即全部)*”是不是?我知道如果我们不叫''close()''仍然有很大的机会传输一些数据流;关闭()确保获得100%的数据。我错了吗? –
@rev_dihazum它的缓冲;如果你不'冲洗'它可能有任何(或没有)的内容保留在缓冲区中。这可能会导致非常困难的错误。 –