Remember to properly close the File!

3921 ワード

原文の住所:http://www.javablogging.com/remember-to-properly-close-the-file/
    今いくつかはjavaの中でFiles、Streams、Connectionとその他のいかなる“closeable”の対象に対してどのように対処するかについてのいくつか提案があります。簡単なのはFileWriter類と一部のエラーで使うそのbugコードです。

public void writeToFile(String fileName, String content) {
    try {
      FileWriter file = new FileWriter(fileName);
      file.write(content);
    } catch (IOException e) {
      // Log the exception
    }
}
    何か問題がありますか?えっと、多くの問題があります。私たちはinput値を検証していません。(もしかしたらnullまたは他のエラーデータですか?)ファイルが存在するかどうか検証していません。あるいはディレクトリに聞いています。指定されたファイルの符号化フォーマットに注意していません。それ以外に説明しても問題はないです。文書を書くにはFileWriterを使うと約束しています。正しいかもしれませんが、やはりこのコードの中で間違っていることがあります。私たちはこの書類を持っていません。
    これは重要ですか?もちろんですこのファイルを閉じないと書けないかもしれません。システムがファイルを占有して解放しません。ずっと覚えています。これらのFiles、Streams、Connection!以下は私達が適切に処理した後のバグのコードです。

    public void writeToFile(String fileName, String content) {
        try {
            FileWriter file = new FileWriter(fileName);
            file.write(content);
            file.close();
        } catch (IOException e) {
            // Log the exeception
        }
    }
     解決しましたか?多くの人が解決したと思っていると思います。しかし、事実は解決されていません。この方法は終了します。このファイルはまだcloseされていません。はい、この問題を解決します。try/finallyで解決します。このような方法は、どんなことがあっても文書のclose操作を実行すると考えられています。

    public void writeToFile(String fileName, String content) {
        try {
            FileWriter file = new FileWriter(fileName);
            file.write(content);
        } catch (IOException e) {
            // Log the exeception
        } finally {
            file.close();
        }
    }
    解決しましたかいいえ、このファイルがfinallyブロック内でnullになります。異常はまだFileWriter構造に投げ出されます。それにNull PointerExceptionになります。修復させてください。

    public void writeToFile(String fileName, String content) {
        try {
            FileWriter file = new FileWriter(fileName);
            file.write(content);
        } catch (IOException e) {
            // Log the exeception
        } finally {
            if (file != null) {
                file.close();
            }
        }
    }
    完成しましたか?やはり残念です。file.closeも同じです。たとえwriteToFileに異常がないとしても、方法の中で投げます。私達は彼らにこのように対処します。

    public void writeToFile(String fileName, String content) {
        try {
            FileWriter file = new FileWriter(fileName);
            try {
                file.write(content);
            } finally {
                file.close();
            }
        } catch (IOException e) {
            // Log the exeception
        }
    }
    とにかく私たちはこの問題を解決しました。バグを修正しました。ここでは、ファイルが閉じる前に、このファイルがnullかどうかを確認しなくてもいいです。nullの場合は、唯一3行目に異常を投げた場合、そのまま10行目にジャンプします。closeable Objectを閉じるときは、小さなことではないので、
これらをしっかり覚えてください
    ここのもう一つの問題は可読性です。上記のコードはあなたにとって理解できます。そして試してみるのはcloseableの対象ではないです。ですから、あなたはcloseableの対象に対処しますか?
一番いい方法はコードを二つの方法に分解することです。一つの処理は異常とクローズ、もう一つは業務の主ロジックを処理することです。上記の説明の具体的なコードを知りたいのですが、下記をご覧ください。

    public void writeToFile(String fileName, String content) {
        try {
            FileWriter file = new FileWriter(fileName);
            try {
                performWriteToFile(file, content)
            } finally {
                file.close();
            }
        } catch (IOException e) {
            // Log the exeception
        }
    }


    // Here we perform all the operations on the file.
    // This method usually is much longer.
    private void performWriteToFile(FileWriter file,
            String content) throws IOException {
        file.write(content);
    }