2012-02-18 37 views
0

私は開発中のクラスでバッファライタを定義していますが、問題があります。私は定義していますクラスのコンストラクタでBufferedWriter - プログラム実行中に途中で終了したストリーム

public class RestHandler { 
public static BufferedWriter rest_logger; 

public RestHandler(parsedXMLConfigData _config, BufferedWriter writer) { 
    rest_logger = writer; 
    try { 
     rest_logger.write("RestHandler instance finished init and ready to receive calls!" + "\n"); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

これが動作し、私のファイルにテキストを出力します。私は私のクラスのメソッドの別の1で同じrest_loggerを使用しようとすると、しかし:

@POST 
@Path("{subResources: [a-zA-Z0-9_/]+}") 
public void postHandler 
(
     @Context final UriInfo uriInfo, 
     @PathParam("subResources") String subResources) { 

    try { 
     rest_logger.write("TEXT..."); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    } 

それは私のストリームに閉じ例外を与えます!私は、ストリームを閉じるためにこれを使用することを言及する必要があります:明確にするために例外ハンドラを削除

protected void finalize() throws Throwable { 
    rest_logger.close(); 
} 

答えて

4

あなたのコードにはいくつかの問題があります。

  • がrest_logger変数は静的であってはならない
  • あなただけ後でそれを破棄し、作家の引数でそれを再初期化する新しいBufferedWriterのにそれを初期化するべきではありません(あなたがコントロールできない)
  • 例外を無視しないでください。あなたは彼らと何をするかわからない場合、あなたのメソッドはIOExceptionをスローにし、呼び出し側は、あなたが作成していないライターを閉じてはならないファイナライザ
  • を使うべきではありません
  • 何をすべきかを決定しましょう。作家のオープナーがそれを閉じさせる。

あなたのコードはあまり意味をなさないので、コードが何をすべきかを理解するのは難しいです。

+0

mycode(私の旧バージョン) –

+2

+1を修正しました。 @MichaelA - JB Nizetが言及している点を除いて、あなたの問題の一つの原因は、あなたのBufferedWriterを静的にして、それを 'finalize()'メソッドで閉じることです。 finalizeは、***クラス***レベル変数を操作している***インスタンス***レベルメソッドです。 – Perception

1

、あなたのコードはありません:

rest_logger = new BufferedWriter(new FileWriter("rest_logger.txt")); 
rest_logger = writer; 

あなたはすぐそこに新しいBufferedWriterことを捨てています。あまり意味がありません。 rest_loggerは、そのコンストラクタ呼び出しであなたに渡されたものに設定されます。それが閉じられると、rest_loggerも閉じます。

+0

私は自分のコードが、まだ同じ問題を修正しました。今見て –

+0

あなたは何かを "修正"しなかった、あなたはそれを変更しました。あなたの問題が何であるか、私たちは「作家」が何であるか、どこから来るのか、いつ閉じられるのかを知らない方法はありません。 – Mat

1

私はあなたの質問を理解し、非常にわからないんだけど、:

正確にあなたが新たに作成されたBufferedWriterのを上書きしている理由は?

rest_logger = writer; 

多分あなたはそれを調べる必要があります...

+0

私は自分のコードを修正しましたが、同じ問題が残っています。今見てください –

+0

まあ、どこの文脈もなくあなたの問題がどこにあるのかは分かりません。私が知る限り、今は 'BufferedWriter'をインスタンス化していないので、コンストラクタを渡しています。それはどこで作られるのですか?これは問題の原因となる可能性があります... – silflow

関連する問題