Javaでファイルをクローズする
BufferedReader in = new BufferedReader(new FileReader("hoge.txt")); try { ... } finally { in.close(); }
のようなコードを見ますが,BufferedReaderはクローズしているけどFileReaderをクローズしていないのは良いのかと常々思っていたのですが,良いようです。なぜかというとBufferedReader.close()の中から,Reader.close()が呼ばれているからです。
public void close() throws IOException { synchronized (lock) { if (in == null) return; try { in.close(); } finally { in = null; cb = null; } } }
ファイルのクローズはJava7からこう書けるようになりました(try-with-resources文)。
try (BufferedReader in = new BufferedReader(new FileReader("hoge.txt"))) { ... }
これはとくに複数のファイルを扱うときに便利です。
Java 6までは
BufferedReader in1 = null; BufferedReader in2 = null; try { in1 = new BufferedReader(new FileReader("hoge.txt")); in2 = new BufferedReader(new FileReader("fuga.txt")); ... } finally { if (in1 != null) { in1.close(); } if (in2 != null) { in2.close(); } }
とか
BufferedReader in1 = new BufferedReader(new FileReader("hoge.txt")); try { BufferedReader in2 = new BufferedReader(new FileReader("fuga.txt")); try { ... } finally { in2.close(); } } finally { in1.close(); }
と書かなければならなかったものが,こう書けるようになったからです。
try (BufferedReader in1 = new BufferedReader(new FileReader("hoge.txt")); BufferedReader in2 = new BufferedReader(new FileReader("fuga.txt"))) { ... }