1

開発中のクラスでバッファライターを定義していますが、問題があります。

私が定義しているクラスコンストラクターでは、次のようになります。

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();
    }
}

これは機能し、テキストをファイルに出力します。しかしrest_logger、クラスメソッドの別の1つで同じものを使おうとすると、次のようになります。

    @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

3 に答える 3

4

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

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

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

于 2012-02-18T10:10:39.713 に答える
1

わかりやすくするために例外ハンドラーを削除すると、コードは次のようになります。

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

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

于 2012-02-18T10:10:20.280 に答える
1

あなたの質問を理解したかどうかはよくわかりませんが、次のようになります。

新しく作成したBufferedWriterを正確に上書きするのはなぜですか?

rest_logger = writer;

多分あなたはそれを調べるべきです...

于 2012-02-18T10:14:44.203 に答える