Javaでテキストファイルを全部読み込む

問題点

Javaでテキストファイルを全部読み込む方法がよくわからない。
そこら辺のサンプルを見ても、ファイルを読むだけなのにnewしまくっていて、何をやっているのかよく分からない。

原因

背景というか全容というか背景が見えていないため。

対策

調べる。

調べかた

ドキュメントを読む。

どんなドキュメントがあるのか。どこにあるのか。

ドキュメントの一覧が以下にあるっぽい(前者が概要で、後者が詳細?)。

後者を見ると、こういう種類のドキュメントがありそうなことがわかる(かっこの中は補足)。

  • API Documentation(ライブラリのリファレンス)
  • Java Language and Virtual Machine Specifications(言語仕様と、VMの仕様)
  • Developer Guides(道案内)
  • JDK / JRE Installation Instructions(インストールのしかた)
  • JDK Release Notes(リリースノート)
  • JDK Troubleshooting Guide(トラブルシューティング
  • Java Tutorials(チュートリアル

で、チュートリアル
Lesson: Basic I/O (The Java™ Tutorials > Essential Classes), http://docs.oracle.com/javase/tutorial/essential/io/index.html
(日本語版)レッスン:基本的なI/O(Java?チュートリアル > 重要なクラス), http://docs.oracle.com/cd/E26537_01/tutorial/essential/io/index.html
を読むとよく分かる。

その後、
java.io クラス階層 (Java Platform SE 6), http://docs.oracle.com/javase/jp/6/api/java/io/package-tree.html
を眺めると、理解が深まる。
と思う。

結論

こうかな。
いまひとつ合ってる確証が持てない。

import java.io.FileReader;
import java.io.BufferedReader;
import java.io.IOException;

public class Test {
    public static void main(String[] args) throws IOException {

        StringBuilder result = new StringBuilder();
        BufferedReader bufferedReader = new BufferedReader(new FileReader("Test.java"));
        try {
            for (int ch; (ch = bufferedReader.read()) != -1; ) {    // ← forは難しいのでなるべく使いたくないけど、whileにするとint chのあたりがきれいじゃなくなる気がする
                result.appendCodePoint(ch);                         // ← あってるのかこれ
            }
        } finally {
            bufferedReader.close();
        }

        System.out.print(result.toString());

    }
}

例外安全性はこれでいいんだろうか。
new FileReader()に成功してnew BufferedReader()に失敗した場合、FileReaderをclose()しなければならない気がするけど、そうしていない。
でも、チュートリアルでもこんなかんじだからいいんだろうか。

BufferedReader を close() しておけば FileReader は close() しなくていいらしい(http://stackoverflow.com/questions/1388602/do-i-need-to-close-both-filereader-and-bufferedreader, http://www.javadrive.jp/start/stream/index3.html)けど、リファレンス(http://docs.oracle.com/javase/jp/6/api/java/io/BufferedReader.html#close())を見ても今ひとつよく分からない。

余談

ちなみにC#だとこう(方法 : ファイルからテキストを読み取る, http://msdn.microsoft.com/ja-jp/library/db5x7c0d(v=vs.80).aspx)。

using System;
using System.IO;

class Test
{
    public static void Main()
    {
        Console.Write(File.ReadAllText("Test.cs"));
    }
}