【Java】バイナリファイルの読み込みと書き込み

2018年3月11日

本稿は、Javaでバイナリファイルの読み込みと書き込みについて説明します。

バイナリファイルとは簡単に言ってしまうとテキストファイル以外を指します。

とはいっても、本当はテキストファイルもバイナリファイルです。

普通は画像ファイルや音声ファイルなどをバイナリファイルと呼びます。中を見てもよくわからないファイルのことです。

もちろん画像や音声を読み込むためのクラスは別に用意されているのですが、すべての基本が今回紹介する内容なので必ず利用できるようにしておきましょう。

バイナリファイルの読み込み

バイナリファイルの読み込みはFileInputStreamを利用することで実現できます。

さらにBufferedInputStreamでラップすることにより効率的な読み込み処理ができます。

試しに、Javaソースをコンパイルしてできたclassファイルを読み込んでみましょう。

import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;

public class Test {
	public static void main(String[] args) {
		try(FileInputStream fis = new FileInputStream("Test.class");
			BufferedInputStream bis = new BufferedInputStream(fis)){

			ByteArrayOutputStream out = new ByteArrayOutputStream();
			byte[] data = new byte[1024];
			int n = bis.read(data);//読み込んだbyte数を取得。終了してたら-1を返す
			while(n != -1) {
				out.write(data,0,n);//読み込んだデータを入れ込み
				n = bis.read(data);
			}
			byte[] result = out.toByteArray();//結果を取得
		} catch ( IOException e ) {
			e.printStackTrace();
		}
	}
}

このサンプルではByteArrayOutputStreamにバイナリデータを入れ込んで、result変数に結果を代入しています。

readメソッドでファイルのデータをバイト配列に読み込み、読み込んだバイト数の取得ができます。

ByteArrayOutputStreamのwriteメソッドで読み込んだバイト数分だけデータを入れ込んでいます。

処理した後に必ずcloseメソッドを呼び出してください。

このサンプルではtry-with-resource構文を利用することで、自動でcloseメソッドを呼び出しています。

バイナリデータの書き込み

バイナリファイルの書き込みはFileOutputStreamを利用することで実現できます。

さらにBufferedOutputStreamでラップすることにより効率的な読み込み処理ができます。

試しに、名前、性別、年齢を保持するバイナリデータを書き出してみましょう。

import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class Test {
	public static void main(String[] args) {
		try(FileOutputStream fos = new FileOutputStream("data.dat");
			BufferedOutputStream bos = new BufferedOutputStream(fos)){

			String name = "山田";
			String gender = "男";
			int old = 45;
			bos.write(name.getBytes());
			bos.write(gender.getBytes());
			bos.write(Integer.toUnsignedString(old).getBytes());
		} catch ( IOException e ) {
			e.printStackTrace();
		}
	}
}
実行結果

内容は単純に文字列をバイト配列に変換して書き込み処理を実装しています。

よって結果はただのテキストファイルになりました。

こちらもcloseメソッドを必ず呼び出さなければなりません。

忘れるとファイルの書き出しがうまくいかない場合があります。

こちらのサンプルもtry-with-resource構文を利用することで、自動でcloseメソッドを呼び出しています。

Java

Posted by nompor