26.1.8.10 ファイルへのバイナリでの入出力

プログラムがファイルとデータのやりとりをするときには,多くの場合に文字列の形式にします.文字列は人間にも読めるので,処理の途中に人間が介在する場合にはこの形式が有効です.

ところが,あるプログラムからの出力を別のプログラムが読むという状況で,その中間的な結果を人間がほとんど知らなくてもよい場合には,直接的なコンピュータの内部表現のままで構いませんし,その方が,文字列との間の変換をしなくてもよい分だけ効率がよくなります.このためにJavaで用意されているのがDataInputStreamDataOutputStreamです.

内部表現とは言っても,他のコンピュータへ送ったときに違う値になってしまっては困りますので,あるコンピュータでDataOutputStreamを使って書いたものを,別のコンピュータにおいて,DataInputStreamで読むと,元の値が正確に表現できるようになっています.

なお,この内部表現のことをバイナリでの表現と呼ぶことがあります.

まずはデータをバイナリで出力するプログラムです.

cautionこのプログラムはdataというファイルを新しく作ろうとします.
もし既に存在する場合には消されてしまいますので注意して下さい.

import java.io.*;

class WriteBinaryData{
    public static void main(String argv[]){
	try{
	    DataOutputStream dout
		= new DataOutputStream(new FileOutputStream("data"));
	    dout.writeUTF("Days in a year is ");
	    dout.writeDouble(365.2422);

	    dout.writeChar((int)'.');
	    dout.writeChar(System.getProperty("line.separator").charAt(0));
	    dout.close();
	}catch(FileNotFoundException e){
	    System.err.println(e);
	}catch(IOException e){
	    System.err.println(e);
	} //end try-catch
    } //end main
} //end class

fileWriteBinaryData.java

次に,上のプログラムの出力したデータをバイナリのまま読み込むプログラムです.

import java.io.*;

class ReadBinaryData{
    public static void main(String argv[]){
	try{
	    DataInputStream din
		= new DataInputStream(new FileInputStream("data"));
	    String s1 = din.readUTF();
	    double d = din.readDouble();
	    char c = din.readChar();
	    char cr = din.readChar();
	    System.out.println(s1 + d + c);
	    din.close();
	}catch (FileNotFoundException e){
	    System.err.println(e);
	}catch(IOException e){
	    System.err.println(e);
	} //end try-catch
    } //end main
} //end class

fileReadBinaryData.java