0

さて、テキスト ファイル (.txt) にログインするための情報行を書き込もうとしていますが、これはコードが書き込めない部分です。これを除いて、他のすべてが機能しますが、エラーは発生しません。

public void writeConfig(File config, Boolean append, String errored){
    try {
        Writer output;
        if (config != null){
            output = new BufferedWriter(new FileWriter(config));
        } else {
            output = new BufferedWriter(new FileWriter(er));
        }
        if (append == true){
            output.append(errored);
        } else {
            output.write(errored);
        }
    } catch (Exception e){
        try {
            loadErrorLog(error, true, "Failed to write to Boom's Log.\n");
        } catch (Exception e1){
            log.info("Major Malfunction #686 : Tell Maker immediatly.");
        }
    }
}
4

1 に答える 1

4

ライターを閉じていません。つまり、すべてのデータがバッファーに残っているだけです。

ブロックで閉じる必要がありfinallyます。

さらに:

  • パラメータの使用は明らかに危険です-ほぼ確実に(または)appendのコンストラクタに渡す必要があります。私はあなたが思っていることをしないと思います。FileWriterFileOutputStreamappendWriter
  • との比較を避けるようにしてくださいtrue-if (append)より明確だったでしょう
  • 条件演算子を使用すると、特にファイルのみFileWriterに使用した場合、コードがよりクリーンになります。

    File file = config == null ? er : config;
    Writer writer = new BufferedWriter(new FileWriter(file));
    
  • FileWriter常にプラットフォームのデフォルトのエンコーディングを使用するため、最初から使用することは避けます。エンコーディングを明示的に指定FileOutputStreamして、代わりにラップされたを使用します(例: UTF-8)OutputStreamWriter
  • Exceptionほとんどの場所でキャッチを避けてください。ここでは、単にキャッチする方がきれいIOExceptionです。
  • loadErrorLogメソッドはおそらく失敗時にそのログを記録する必要があるようです。そうしないと、呼び出すたびにそのコードブロックを作成することになると思います
  • 構成の書き込みに失敗した場合、本当に続行しますか? 例外を処理するのは間違いなくこのメソッドですか?ブロックを完全に削除して( /catchだけを残して)、バブルをスタックに上げる可能性がありますtryfinallyIOException
于 2012-06-26T06:14:54.980 に答える