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"))) {
    ...
}