今回は「ファイルの読み込み」に関して、ふたつの方法をご紹介します。
初心者の方はこれらの方法のどちらが便利で自分に合っているかを知る為にも、まずは全てをマスターしてみましょう。
NIOを使ってファイルを読み込む
JDK7から追加されたNewI/O 2(ファイル処理のAPI)を利用する方法が最もメジャーで簡単だと言えます。
nioパッケージを一度でも経験すると、今まで学習してきたFile操作の方法を根底から否定したくなるでしょう。
そこでまずはこのnioパッケージを使った方法を紹介します。
ファイルの内容をbyte配列にする
FilesクラスのメソッドであるFiles.readAllBytesメソッドを使うことで、ファイルをバイナリデータとしてbyte配列に読み込むことが出来ます。(Java 7以降)
記述は以下の通りです。
// まず必要なパッケージをimport import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Paths; import java.io.IOException; public class Main { public static void main(String[] args) { try { sampleMethod("test.txt"); } catch (IOException e) { System.out.println("読み込み失敗"); } } public static void sampleMethod(String filePath) throws IOException { // ファイルをバイト列として読み込む byte[] fileContentBytes = Files.readAllBytes(Paths.get(filePath)); // 読み込んだバイト列を UTF-8 でデコードして文字列にする String fileContentStr = new String(fileContentBytes, StandardCharsets.UTF_8); } }
なお、このコードではサンプルとして存在しないファイルを読み込ませてあるため、実行結果は「読み込み失敗」と表示されます。
またFiles.readAllBytesは”IOException”が発生しますので、必ずthrowsで適正に例外処理をすることを忘れないようにしてください。
ファイルの内容をStringにする
上のコードと同じようにして”readString”を使うことで、ファイルの内容を全てString型として読み込むことが出来ます。
記述は以下の通りです。
String content = Files.readString(Paths.get("sample.txt"), StandardCharsets.UTF_8);
Filesクラスの注意点
Filesクラスのメソッドを使用して容量の膨大なファイルを扱う際にはメモリ不足にならないように注意が必要となります。
またこの方法は簡単に利用することができ大変便利なものではありますが、学習する上ではあまりオススメは出来ないものとなっています。
理由としては、短いコードだけで全て完結出来てしまうことでプログラムの流れを把握できないことです。
もし主な目的が学習というのであれば、FileReaderを使った方法を覚えた方が良いかもしれません。
Readerを使ってファイルを読み込む
先ほどJDK7から追加されたNewI/O 2を使った方法を紹介しましたが、それ以前はjava.io.FileReaderやFileInputStreamを使う方法が一般的でした。
ファイル読み込みとしては大変優秀で、環境に左右されることがありません。(Java 7以前の環境でも使えるため)
互換性を重視するならNewI/O 2より安定した結果を得られるでしょう。
またこの方法は非常に多くの開発者にとって一般的な方法で学習コストも低く、参考となる情報もインターネットでいくらでも見つけることが出来ます。
FileReaderで読み込む
“FileReader”は”BufferedReader”を組み合わせることで”BufferedReader.readLine”を使用し1行ずつ読み込むことが出来ます。
記述は以下の通りです。
import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; public class Main { public static void main(String[] args) { try { sampleMethod("C:\\sample.txt"); } catch (IOException e) { System.out.println("失敗"); } } public static void sampleMethod(String filePath) throws IOException { File file = new File(filePath); FileReader fileReader = new FileReader(file); BufferedReader bufferedReader = new BufferedReader(fileReader); String text; while ((text = bufferedReader.readLine()) != null) { System.out.println(text); } bufferedReader.close(); } }
この方法での注意点は最後に記述している「bufferedReader.close();」です。
処理が完了したら必ずFileReaderクラスのcloseメソッドを使い、ファイル操作を終了しリソースを開放するようにしてください。
FileReaderにBufferedReaderを組み合わせるメリット
FileReaderクラスにはもともとreadメソッドがありますので、読み込むだけならBufferedReaderを組み合わせることなく完結出来ます。
ただし、readメソッドは1文字ずつ読み込むという特性から、文章など文字数の多いファイルを読み込む場合には効率という観点から見るとあまりにも非効率的な為、BufferedReaderと組み合わせることでバッファリング(一時的にメモリに情報を蓄積させ、ある程度まとまった量になったら読み込む)させることで効率よくリソースを使えます。
これが最大のメリットと言えるでしょう。
ただし先に解説したNewI/O 2を使った方法と速度比較した場合、50万字程度でも読み込み速度が0.1秒も変わらないという結果も出ていることから、どちらを使った方が早いかについてはどちらでもよいと言えます。
まとめ
いかがでしたか?
今回はJavaにおけるファイルの扱いについて解説しました。
この記事を読んでファイル読み込み方法の違いについて理解してもらえたら嬉しく思います。