Javaでファイルのデータを読み書きするには、さまざまな方法があるようです。
私はファイルからASCIIデータを読みたいと思っています。どのような方法があり、その違いは何でしょうか?
小さなファイルを読むための私のお気に入りの方法は、BufferedReaderとStringBuilderを使うことです。非常にシンプルでポイントを押さえた方法です(特に効果的ではありませんが、ほとんどのケースでは十分です)。
BufferedReader br = new BufferedReader(new FileReader("file.txt"));
try {
StringBuilder sb = new StringBuilder();
String line = br.readLine();
while (line != null) {
sb.append(line);
sb.append(System.lineSeparator());
line = br.readLine();
}
String everything = sb.toString();
} finally {
br.close();
}
Java 7以降はtry-with-resourcesを使うべきだという指摘もあります。(オートクローズ)機能を使うべきだという指摘もあります。
try(BufferedReader br = new BufferedReader(new FileReader("file.txt"))) {
StringBuilder sb = new StringBuilder();
String line = br.readLine();
while (line != null) {
sb.append(line);
sb.append(System.lineSeparator());
line = br.readLine();
}
String everything = sb.toString();
}
このような文字列を読むときは、とにかく一行ごとに文字列処理をしたいので、このような実装にしています。
ただ、実際にファイルを読み込んで文字列にしたい場合は、いつも Apache Commons IO の IOUtils.toString() メソッドというクラスを使っています。そのソースはこちらです。
http://www.docjar.com/html/api/org/apache/commons/io/IOUtils.java.html
FileInputStream inputStream = new FileInputStream("foo.txt");
try {
String everything = IOUtils.toString(inputStream);
} finally {
inputStream.close();
}
また、Java 7ではさらにシンプルになります。
try(FileInputStream inputStream = new FileInputStream("foo.txt")) {
String everything = IOUtils.toString(inputStream);
// do something with everything string
}
ASCIIはTEXTファイルなので、読み込みにはReaders
を使います。Javaでは、[InputStreams
][2]を使ったバイナリファイルからの読み込みもサポートしています。読み込むファイルが巨大な場合には、読み込みのパフォーマンスを向上させるために、FileReader
の上にBufferedReader
を使用するとよいでしょう。
Reader`の使い方についてはこちらの記事をご覧ください。
また、Thinking In Javaという素晴らしい(しかも無料の)本をダウンロードして読むことをお勧めします。
Java 7で。
new String(Files.readAllBytes(...))
(docs)を参照してください。 または
Files.readAllLines(...)
(docs)のようになります。
Java 8の場合。
Files.lines(..).forEach(...)
(docs)を参照してください。
[2]: http://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html
最も簡単な方法は、JavaのScanner
クラスとFileReaderオブジェクトを使うことです。簡単な例です。
Scanner in = new Scanner(new FileReader("filename.txt"));
Scanner
には、文字列や数値などを読み込むためのいくつかのメソッドがあります。これについては、Javaのドキュメントページで詳細を探すことができます。
例えば、コンテンツ全体を String
に読み込んだりします。
StringBuilder sb = new StringBuilder();
while(in.hasNext()) {
sb.append(in.next());
}
in.close();
outString = sb.toString();
また、特定のエンコーディングが必要な場合は、FileReader
の代わりにこれを使うことができます。
new InputStreamReader(new FileInputStream(fileUtf8), StandardCharsets.UTF_8)