2016-04-23 16 views
1

私は、文字列を圧縮するために使用する次の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にデータを書き込むため

+4

[ '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)を好むでしょう。 –

+0

@ElliottFrisch "*残りのデータがある(つまり、すべて)*"そうですか?私たちが '' close() ''と呼んでいないかどうかは分かっていましたが、まだストリームが送信される可能性は非常に高いです。 close()は100%のデータを確保します。私が間違っている? –

+0

@rev_dihazumバッファリングされています。もしそれを ''フラッシュしないと、バッファに残っている(またはできない)コンテンツがあるかもしれません。非常に困難なバグにつながる可能性があります。 –

答えて

0

理由があります。 deflaterOutputStreamが閉じられるまで、byteArrayOutputStreamにはデータが含まれていません。

+0

戻り後にdeflaterOutputStreamを閉じると、メソッドの出力にどのような影響がありますか?それが閉じていない場合でも、Base64.encodeBytes(byteArrayOutputStream.toByteArray()、Base64.DONT_BREAK_LINES)は正しい値を返しますか? –

+0

いいえ、あなたがそれを閉じなければ、メモリを解放せず、書き込みもしない、それは正しい値を返さないことを意味します... – Dazak

+0

deflatedOutputStreamを閉じると、値をbyteArrayOutputStreamに書き込み/フラッシュしますか? –

2

deflaterOutputStreamが閉じられており、がフラッシュされたであるため、byteArrayOutputStreamが入力されます。

-1

あなたはtryブロックでreturn文を置いていても例外が発生したり上がっていない場合は、あなたのfinallyブロックが実行され、finallyブロックの機能があれば例外が発生し、取り扱いや、その後処理されないにもかかわらず、

ありますfinallyブロックは、あなたのコードでは、あなたがtryまたはcatchブロック

system.exit()を配置する場合、finallyブロックは実行されません、実行されます

try{ 
return------> this wont return instead finally block will execute 
} 
finally{ 
// 
} 

あなたの終値DeflaterOutputStreamと、それはそれは空

関連する問題