私は、文字列を圧縮するために使用する次の2つのコードブロックを持っています。tryとtryの後の戻り場所で異なる動作
コード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);
}
第1の方法は常に空の文字列を返す場合にのみ、第二の方法は、正常に動作します。私は、この異なる動作が、最終的なブロックに対するリターンブロックの異なる配置のために発生することを理解しています。これに対する正確な行動は何ですか?第二は、
deflaterOutputStream
最初のクローズ操作を行いながら第一の方法ではreturn文はあなたがdeflaterOutputStream.close();
を行う前に実行され、それが接続を閉じると、byteArrayOutputStream
にデータを書き込むため
[ 'close'のJavaDoc](https://docs.oracle.com/javase/8/docs/api/java/util/を返しているフラッシュzip/DeflaterOutputStream.html#close--)は、残っている圧縮データを出力ストリームに書き込み、そのストリームを閉じます*。おそらく、ストリームに書き込まれていない残りの*データ(つまりそのすべて)がクローズされていなければ(「flush'」も参照)(https://docs.oracle.com/ javase/8/docs/api/java/util/zip/DeflaterOutputStream.html#flush--))。また、私は['try-with-resources'](http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html)を好むでしょう。 –
@ElliottFrisch "*残りのデータがある(つまり、すべて)*"そうですか?私たちが '' close() ''と呼んでいないかどうかは分かっていましたが、まだストリームが送信される可能性は非常に高いです。 close()は100%のデータを確保します。私が間違っている? –
@rev_dihazumバッファリングされています。もしそれを ''フラッシュしないと、バッファに残っている(またはできない)コンテンツがあるかもしれません。非常に困難なバグにつながる可能性があります。 –