Javaでテキストファイルを全部読み込む
問題点
Javaでテキストファイルを全部読み込む方法がよくわからない。
そこら辺のサンプルを見ても、ファイルを読むだけなのにnewしまくっていて、何をやっているのかよく分からない。
原因
背景というか全容というか背景が見えていないため。
対策
調べる。
調べかた
ドキュメントを読む。
どんなドキュメントがあるのか。どこにあるのか。
ドキュメントの一覧が以下にあるっぽい(前者が概要で、後者が詳細?)。
- Java SE Documentation at a Glance, http://www.oracle.com/technetwork/java/javase/documentation/index.html
- Java SE Technical Documentation, http://docs.oracle.com/javase/index.html
後者を見ると、こういう種類のドキュメントがありそうなことがわかる(かっこの中は補足)。
- 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")); } }