【Java】FileInputStreamクラスを使ってファイルにデータを読み込む!

ファイルにデータを読み込むにはFileInputStreamクラスを使用します。

FileInputStreamクラスは、ファイルのバイト単位のデータを読み込むときに使用する入力ストリームのクラスです。

ストリームとはホースのようなもので、ホースの中に水が流れるように、ストリームの中をデータが流れていくイメージです。

そのため、FileInputStreamクラスを使用すること作成したファイルのデータ内容を読み込むことができます。

今回はFileクラスのFileInputStreamクラスを使って、ファイルのデータを読み込む方法について解説していきます。

FileInputStreamクラスとは

FileInputStreamクラスとは、ファイルにバイト単位のデータを読み込むときに使用する入力ストリームのクラスです。

FileInputStreamクラスの書き方

FileInputStreamクラスの構文は下記となります。

FileInputStreamクラスが使用できるようにFileInputStreamをインポートする必要があります。

インポートすることで、FileInputStreamクラスで準備されているメソッドを使用できるようになります。

ファイルにデータを読み込むサンプルコード

ファイルにデータを書き込むサンプルコードを紹介します。

Stream.txt

Stream.txtは、文字コードをUTF-8、改行コードをCR+LFで、「C:¥study」以下に用意します。
また、末尾に改行を入れています。

その状態でMain.javaを実行します。

Main.java

出力結果

ストリームを使ってファイルを読み込む
0xe5 0x8c 0×97 0xe6 0xb5 0xb7 0xe9 0x81
0x93 0x0d 0x0a 0xe9 0x9d 0x92 0xe6 0xa3
0xae 0xe7 0x9c 0x8c 0xe5 0xb2 0xa9 0xe6
0x89 0x8b 0xe7 0x9c 0x8c 0xe7 0xa7 0x8b
0xe7 0x94 0xb0 0xe7 0x9c 0x8c 0xe5 0xae
0xae 0xe5 0x9f 0x8e 0xe7 0x9c 0x8c 0xes
0x01 0xb1 0xe5 0xbd 0xa2 0xe7 0x9C 0x8c
0xe7 0xa6 0x8f 0xe5 0xb3 0xb6 0xe7 0x9c

0x8c 0x0d 0x0a

チャネルを使ってファイルを読み込む
0xe5 0x8c 0×97 0xe6 0xb5 0xb7 0xe9 0x81
0x93 0x0d 0x0a 0xe9 0x9d 0x92 0xe6 0xa3
0xae 0xe7 0x9c 0x8c 0xe5 0xb2 0xa9 0xe6
0x89 0x8b 0xe7 0x9c 0x8c 0xe7 0xa7 0x8b
0xe7 0x94 0xb0 0xe7 0x9c 0x8c 0xe5 0xae
0xae 0xe5 0x9f 0x8e 0xe7 0x9c 0x8c 0xes
0x01 0xb1 0xe5 0xbd 0xa2 0xe7 0x9C 0x8c
0xe7 0xa6 0x8f 0xe5 0xb3 0xb6 0xe7 0x9c

0x8c 0x0d 0x0a

FileInputStreamクラスよってファイルの内容を読み込んでいます。
そして、dumpメソッドによって、byte配列を16進数ダンプ表示しています。

FileChannelクラスを使用してファイルにデータを読み込む場合

サンプルコードのMain.javaにあるもう1つの「channel」メソッドでは、チャネルを使ってファイルを読み込んでいます。
チャネルはストリームに比べ単純なことしかできませんが その分、高速に処理を行うことができます。
ファイルを扱うチャネルとして、「FileChannel」クラスが用意されています。

チャネルは既存のストリームから作成するため、publicなコンストラクタがありません。
「FileChannel|クラスのインスタンスは、FileInputStreamクラスのgetChannelメソッドで取得しています。

次に、読み込みに使うバッファを用意します。
ここでは、「Buffer」クラスのサブクラスである「ByteBuffer」を使います。

Bufferクラスは、「ポジション」「リミット」「キャパシティ」 の3つのプロパティを持っています。
「ポジション」はBuffer内のどこを操作しているかを、「リミット」はBuffer内のどこまでデータを格納しているかを、「キャパシティ」はBufferの 容量をそれぞれ示します。

バッファを操作すると、これらの値は次のように変化します。

処理内容 説明
バッファの初期化を行う
ByteBuffer b = ByteBuffer.allocateDirect(8);
8バイトの容量でバッファを生成する。
ポジションは先頭、リミットとキャパシティ
は最後になる。
バッファに値を書き込む
b.put((byte) Ox01):
b.put((byte) Ox02);
バッファに値を書き込むと、その分だけ b.put((byte) Ox01):ポジションがずれる。
ポジションがリミットの位置にある状態でさらに書き込もうとすると例外が発生する。
flipメソッドを呼び出す
b.flip();
flipメソッドを呼び出すとリミットをポジションの位置に移動し、ポジションをバッファの先頭に移動する。
getメソッドを呼び出す
byte[] bytes = new byte[8];
b.get(bytes, 0, b.limit());
getメソッドを呼び出すと、ポジションの位置から「第3パラメーター 第2パラメータ」の数だけを1パラメータのバイト配列に出力する。
bytesの中身は|01,02,00,00,00,00,00.00|となる。
clearメソッドを呼び出す
b.clear();
clearメソッドを呼び出すと、ポジションとリミットが初期状態に戻る。
バッファ内はそのまま。

「channel」メソッドでは、これらの処理を繰り返してファイルを読み込んでいます。
「ByteBuffer」インスタンスを作成するメソッドには、ByteBufferクラスのallocateメソッドとByteBufferクラスのallocateDirectメソッドがあります。

allocateDirectメソッドは、Javaのヒープ外のメモリを確保できればヒープ外に、できなければallocateDirectメソッドでJavaのヒープ内にメモリを確保します。

ヒープ外のメモリの方が高速に処理を行うことができます。

今回のポイント

FileOutputStreamクラスでファイルにデータを書き込む

ファイルからデータを読み込むにはFileInputStreamクラスを使用する。

⚫︎ リソースからデータを読み込むには、入力ストリームを使用し、リソースがファイルの場合は、FileInputStreamクラスを使用する

⚫︎ BufferedInputStreamクラスでラップしてバッファリングしながら読み込むことで、データの読み込みの効率を上げることができる

⚫︎ 読み込みが終わったらリソースを解放する必要がありますが、BufferedInputStreamクラスのcloseメソッドを呼び出すことで「FileInputStream」イ ンスタンスのリソースも解放されます。

⚫︎ データを読み込むには、BufferedInputStreamクラスのreadメソッドを使います。

⚫︎ readメソッドの第1パラメータは、読み込んだデータを格納するバイト配列であり、第2パラメータはバイト配列のどこからデータを格納し始めるか、第3パラメータはバイト配列のどこまでデータを格納するかを指定する(特に理由がなければ、配列の最初から最後まで読み込むようにする)

⚫︎ readメソッドでファイルの終端まで読み込んだときは、 バイト配列の大きさ以下の値を返し、その状態でさらに読み込もうとすると「-1」を返す

⚫︎ FileChannelクラスではチャネルを使ってファイルを読み込む

関連記事

FileOutputStreamクラスでファイルにデータを書き込む方法ついてはこちらをご参考ください。

Writer
壷井

壷井

株式会社flyhawkの壷井です。フライテックメディア事業部でのメディア運営・ライター業務なども担当。愛機はMac Book AirとThinkPad。好きな言語:swift、JS系(Node.js等)。好きなサーバー:AWS。受託開発やプログラミングスクールの運営をしております。ご気軽にお問い合わせください。

最新の案件情報

フリーランスエンジニアの案件探し