バナー画像

今回は「ファイルの読み込み」に関して、ふたつの方法をご紹介します。

初心者の方はこれらの方法のどちらが便利で自分に合っているかを知る為にも、まずは全てをマスターしてみましょう。

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におけるファイルの扱いについて解説しました。

この記事を読んでファイル読み込み方法の違いについて理解してもらえたら嬉しく思います。

 

エンジニアになりたい人に選ばれるプログラミングスクール「ポテパンキャンプ 」

ポテパンキャンプは卒業生の多くがWebエンジニアとして活躍している実践型プログラミングスクールです。 1000名以上が受講しており、その多くが上場企業、ベンチャー企業のWebエンジニアとして活躍しています。

基礎的な学習だけで満足せず、実際にプログラミングを覚えて実践で使えるレベルまで学習したいという方に人気です。 プログラミングを学習し実践で使うには様々な要素が必要です。

それがマルっと詰まっているポテパンキャンプでプログラミングを学習してみませんか?

卒業生の多くがWebエンジニアとして活躍

卒業生の多くがWeb企業で活躍しております。
実践的なカリキュラムをこなしているからこそ現場でも戦力となっております。
活躍する卒業生のインタビューもございますので是非御覧ください。

経験豊富なエンジニア陣が直接指導

実践的なカリキュラムと経験豊富なエンジニアが直接指導にあたります。
有名企業のエンジニアも多数在籍し品質高いWebアプリケーションを作れるようサポートします。

満足度高くコスパの高いプログラミングスクール「ポテパンキャンプ」

運営する株式会社ポテパンは10,000人以上のエンジニアのキャリアサポートを行ってきております。
そのノウハウを活かして実践的なカリキュラムを随時アップデートしております。

代表の宮崎もプログラミングを覚えサイトを作りポテパンを創業しました。
本気でプログラミングを身につけたいという方にコスパ良く受講していただきたいと思っておりますので、気になる方はぜひスクール詳細をのぞいてくださいませ。