バイト出力ストリーム
日本語 | バイト入力流れ |
英語 | byte-output stream |
ふりがな | ばいとしゅつりょくすとりーむ |
フリガナ | バイトシュツリョクストリーム |
ストリームの一種。
バイトストリームの一種で、出力を行う。
バイトストリームと異なり、byte型データを取得するために使用する。
また、バイト入力ストリームと異なり、入力ではなく出力を行うために使用する。
具体的には、OutputStreamクラス及びそのサブクラスを指す。
J2SEの以下のクラスが該当する。
・OutputStream
・ByteArrayOutputStream
・FileOutputStream
・PipedOutputStream
・FilterOutputStream
・BufferedOutputStream
・ObjectOutputStream
・DataOutputStream
・PrintStream
役割で分けると以下のようになる。
■スーパークラス
・OutputStream
■出力先
・ByteArrayOutputStream
・FileOutputStream
・PipedOutputStream
■中継ぎ
・FilterOutputStream
・BufferedOutputStream
■出力用
・ObjectOutputStream
・DataOutputStream
・PrintStream
「バイト」をストリームに出力するためのクラス。
まず、対象とするストリームを元に、「出力先」クラスを決定する。
byte型配列を対象とするならByteArrayOutputStreamクラスを使用する。
ファイルを対象とするならFileOutputStreamクラスを使用する。
PipedInputStreamクラスを対象とするならPipedOutputStreamクラスを使用する。
これらのクラスのコンストラクタで「本当の出力先」を指定することで接続する。
出力先クラスがあれば、基本的にはストリームにbyte型データを出力することができる。
write()メソッドでbyte型データを出力する。
引数が(int)のwrite()メソッドは、1バイトずつ出力する。int型を引数に受け取るが、実際に処理されるのはbyte型のサイズのみのため、渡せる値は0x00~0xFFとなる。
引数が(byte[])のwrite()メソッドは、渡したbyte型配列をまとめて出力する。
「出力先」クラスだけでは不便な場合は、「中継ぎ」となるクラスを使用する。
「バッファリング」、つまりストリームにバイトデータをまとめて出力する場合にはBufferedOutputStreamクラスを使用する。
この「中継ぎ」クラスはコンストラクタにOutputStreamクラスのサブクラスを渡すことができるため、コンストラクタに出力先クラスや他の中継ぎクラスを渡すことで、「出力先←中継ぎ←中継ぎ」のようにチェーン化することができる。
チェーン化すると、出力先の方向へとバケツリレーのようにwriter()メソッドを呼び出し、その際にバイトデータを渡していき出力先ストリームへと出力する。その呼び出しの間に、中継ぎクラスはバッファリング等の処理を行う。
さらに、クラスのインスタンスやプリミティブ型の出力を容易にする場合には「出力用」のクラスを使用する。
出力用クラスは、クラスのインスタンスやプリミティブ型を出力する場合に「便利なメソッド」を提供する。write()メソッドはbyte型しか出力できないため、write()メソッドでは不便である。
そのため、出力に便利なメソッドを持つ出力用クラスを出力先クラスや中継ぎクラスに接続し、出力用クラスのメソッドを呼ぶようにする。
直列化可能なクラスを直接直列化する場合にはObjectOutputStreamクラスを使用する。ただし、出力するクラスは直列化可能である必要があり、取得にはObjectInputStreamクラスを使用する必要がある。
ストリームにプリミティブ型のデータを出力する場合にはDataOutputStreamクラスを使用する。ただし、ストリームから取得するためにはDataInputStreamクラスを使用する必要がある。
つまり、どちらも「対になる出力側クラスで出力したもの」を取得できる、ということである。直列化したインスタンスをバイト形式にする方法や、プリミティブ型をバイト形式に変換する方法は特別なものであり、その「特別な形式」で出力されたものを「特別な形式」で取得できる、ということになる。
PrintStreamクラスはストリームに文字列形式で出力する。print()メソッド及びprintln()メソッドを持ち、これらはあらゆるプリミティブ型にオーバーロードされている。プリミティブ型なら全て渡すことができ、文字列へと変換し、さらにbyte型配列へと変換してから、出力先クラスのwrite()メソッドを呼び出して出力する。println()メソッドは出力時に改行も加える。文字列として出力するため後から取得するためには向かないが、単純に出力する分には向いている。
終了時には、close()メソッドを呼び出す。
出力先のストリームがファイルやソケットである場合、処理後は必ずclose()メソッドを呼び終了処理を行う必要がある。そのため、close()メソッドはfinallyブロック内で行うようにする。
念のため、文字列を扱う出力先クラスや、中継ぎクラス、出力用クラスのclose()メソッドも呼び出す。これは多くの場合必要はないが、呼んでおいた方が精神的にいいだろう。
中継ぎクラス、出力用クラスのclose()メソッドを呼び出すと、ほとんどのクラスはコンストラクタで渡された出力先クラスや中継ぎクラス、つまり「チェーンで連結している先」のclose()メソッドも呼び出すため、本当はチェーンの「実際に使用する側」、つまり出力用クラスか、出力用クラスがなければ中継ぎクラスのclose()メソッドを呼び出せば、接続先の文字出力ストリームクラスのclose()メソッドも呼び出してくれるが、仕様上必ずしもそうとは決められていないため、ひとつずつclose()メソッドを呼び出した方がいいだろう。
ストリームへの出力に失敗したとき等には、IOException例外が投げられる。
特にファイルやソケットが対象の場合、ケーブルが外された、等の外的要因によって出力に失敗する場合があるため、必ず例外の発生に対応する必要がある。
そのため、使用時にはtryブロックで囲み、IOExceptionクラスを拾うようにし、その後finallyブロックでclose()メソッドを呼び出すようにする。
ちなみに、このclose()メソッドもIOException例外を投げるため、これも拾うようにする。閉じる時に投げられる例外のため、行う処理は拾った際にはログの出力等を行うくらいでいいだろう。
このように、出力先クラス、中継ぎクラス、出力用クラスは「チェーン」で接続される。
「出力先クラス←中継ぎクラス←出力用クラス」とチェーン化する場合、まず出力先クラスのインスタンスを作成し、その参照を中継ぎクラスのインスタンス作成時のコンストラクタに渡し、その参照を出力用クラスのインスタンス作成時のコンストラクタに渡す。
このように「接続先の文字出力ストリームクラス」をコンストラクタで渡すことで、write()をメソッドを呼び出すと、接続先のwrite()メソッドが呼ばれる仕組みとなる。
一般的な使用方法としては、以下のようになる。
バイナリーファイルを出力する場合には、出力先クラスにFileOutputStreamクラス、中継ぎクラスにBufferedOutputStreamクラス、出力用クラスにDataOutputStreamクラスを使用する。プリミティブ型からbyte型配列への変換はDataOutputStreamクラスで行い、それをBufferedOutputStreamクラスでまとめて出力し、最後はFileOutputStreamクラスでファイルへと出力する。
ただし、この方法で出力したファイルはバイナリーファイルとなるため、ファイルからデータを取得するためにはDataInputStreamクラスで出力されている場合に限定される。
クラス丸ごと出力する場合には、出力用クラスにはObjectOutputStreamクラスを使用する。
ただし、この方法が有効なのは、出力するクラスが直列化可能であり、さらにファイルから取得するためにはObjectInputStreamクラスを使用する必要がある。
それ以外の目的の場合、対象に合わせた出力先ストリームクラスにBufferedOutputStreamクラスを接続し、byte型配列として出力する。
実際、バイナリーデータは様々な形式のデータであり、その変換には格納されているデータ毎に異なる処理が必要となる。そのため、データを適切な形式でbyte型配列に変換してから出力するのがいいだろう。
バイト出力ストリームは、バイトデータを出力するためのクラスである。
そのため、文字列やテキストファイルといった「文字列形式での出力」には向いていない。これら文字列の出力には文字出力ストリームを使用する。
ただし、PrintStreamクラスでも文字列形式で出力できるため、問題がなければPrintStreamクラスを使用してもよい。
バイトストリームの一種で、出力を行う。
バイトストリームと異なり、byte型データを取得するために使用する。
また、バイト入力ストリームと異なり、入力ではなく出力を行うために使用する。
具体的には、OutputStreamクラス及びそのサブクラスを指す。
J2SEの以下のクラスが該当する。
・OutputStream
・ByteArrayOutputStream
・FileOutputStream
・PipedOutputStream
・FilterOutputStream
・BufferedOutputStream
・ObjectOutputStream
・DataOutputStream
・PrintStream
役割で分けると以下のようになる。
■スーパークラス
・OutputStream
■出力先
・ByteArrayOutputStream
・FileOutputStream
・PipedOutputStream
■中継ぎ
・FilterOutputStream
・BufferedOutputStream
■出力用
・ObjectOutputStream
・DataOutputStream
・PrintStream
「バイト」をストリームに出力するためのクラス。
まず、対象とするストリームを元に、「出力先」クラスを決定する。
byte型配列を対象とするならByteArrayOutputStreamクラスを使用する。
ファイルを対象とするならFileOutputStreamクラスを使用する。
PipedInputStreamクラスを対象とするならPipedOutputStreamクラスを使用する。
これらのクラスのコンストラクタで「本当の出力先」を指定することで接続する。
出力先クラスがあれば、基本的にはストリームにbyte型データを出力することができる。
write()メソッドでbyte型データを出力する。
引数が(int)のwrite()メソッドは、1バイトずつ出力する。int型を引数に受け取るが、実際に処理されるのはbyte型のサイズのみのため、渡せる値は0x00~0xFFとなる。
引数が(byte[])のwrite()メソッドは、渡したbyte型配列をまとめて出力する。
「出力先」クラスだけでは不便な場合は、「中継ぎ」となるクラスを使用する。
「バッファリング」、つまりストリームにバイトデータをまとめて出力する場合にはBufferedOutputStreamクラスを使用する。
この「中継ぎ」クラスはコンストラクタにOutputStreamクラスのサブクラスを渡すことができるため、コンストラクタに出力先クラスや他の中継ぎクラスを渡すことで、「出力先←中継ぎ←中継ぎ」のようにチェーン化することができる。
チェーン化すると、出力先の方向へとバケツリレーのようにwriter()メソッドを呼び出し、その際にバイトデータを渡していき出力先ストリームへと出力する。その呼び出しの間に、中継ぎクラスはバッファリング等の処理を行う。
さらに、クラスのインスタンスやプリミティブ型の出力を容易にする場合には「出力用」のクラスを使用する。
出力用クラスは、クラスのインスタンスやプリミティブ型を出力する場合に「便利なメソッド」を提供する。write()メソッドはbyte型しか出力できないため、write()メソッドでは不便である。
そのため、出力に便利なメソッドを持つ出力用クラスを出力先クラスや中継ぎクラスに接続し、出力用クラスのメソッドを呼ぶようにする。
直列化可能なクラスを直接直列化する場合にはObjectOutputStreamクラスを使用する。ただし、出力するクラスは直列化可能である必要があり、取得にはObjectInputStreamクラスを使用する必要がある。
ストリームにプリミティブ型のデータを出力する場合にはDataOutputStreamクラスを使用する。ただし、ストリームから取得するためにはDataInputStreamクラスを使用する必要がある。
つまり、どちらも「対になる出力側クラスで出力したもの」を取得できる、ということである。直列化したインスタンスをバイト形式にする方法や、プリミティブ型をバイト形式に変換する方法は特別なものであり、その「特別な形式」で出力されたものを「特別な形式」で取得できる、ということになる。
PrintStreamクラスはストリームに文字列形式で出力する。print()メソッド及びprintln()メソッドを持ち、これらはあらゆるプリミティブ型にオーバーロードされている。プリミティブ型なら全て渡すことができ、文字列へと変換し、さらにbyte型配列へと変換してから、出力先クラスのwrite()メソッドを呼び出して出力する。println()メソッドは出力時に改行も加える。文字列として出力するため後から取得するためには向かないが、単純に出力する分には向いている。
終了時には、close()メソッドを呼び出す。
出力先のストリームがファイルやソケットである場合、処理後は必ずclose()メソッドを呼び終了処理を行う必要がある。そのため、close()メソッドはfinallyブロック内で行うようにする。
念のため、文字列を扱う出力先クラスや、中継ぎクラス、出力用クラスのclose()メソッドも呼び出す。これは多くの場合必要はないが、呼んでおいた方が精神的にいいだろう。
中継ぎクラス、出力用クラスのclose()メソッドを呼び出すと、ほとんどのクラスはコンストラクタで渡された出力先クラスや中継ぎクラス、つまり「チェーンで連結している先」のclose()メソッドも呼び出すため、本当はチェーンの「実際に使用する側」、つまり出力用クラスか、出力用クラスがなければ中継ぎクラスのclose()メソッドを呼び出せば、接続先の文字出力ストリームクラスのclose()メソッドも呼び出してくれるが、仕様上必ずしもそうとは決められていないため、ひとつずつclose()メソッドを呼び出した方がいいだろう。
ストリームへの出力に失敗したとき等には、IOException例外が投げられる。
特にファイルやソケットが対象の場合、ケーブルが外された、等の外的要因によって出力に失敗する場合があるため、必ず例外の発生に対応する必要がある。
そのため、使用時にはtryブロックで囲み、IOExceptionクラスを拾うようにし、その後finallyブロックでclose()メソッドを呼び出すようにする。
ちなみに、このclose()メソッドもIOException例外を投げるため、これも拾うようにする。閉じる時に投げられる例外のため、行う処理は拾った際にはログの出力等を行うくらいでいいだろう。
このように、出力先クラス、中継ぎクラス、出力用クラスは「チェーン」で接続される。
「出力先クラス←中継ぎクラス←出力用クラス」とチェーン化する場合、まず出力先クラスのインスタンスを作成し、その参照を中継ぎクラスのインスタンス作成時のコンストラクタに渡し、その参照を出力用クラスのインスタンス作成時のコンストラクタに渡す。
このように「接続先の文字出力ストリームクラス」をコンストラクタで渡すことで、write()をメソッドを呼び出すと、接続先のwrite()メソッドが呼ばれる仕組みとなる。
一般的な使用方法としては、以下のようになる。
バイナリーファイルを出力する場合には、出力先クラスにFileOutputStreamクラス、中継ぎクラスにBufferedOutputStreamクラス、出力用クラスにDataOutputStreamクラスを使用する。プリミティブ型からbyte型配列への変換はDataOutputStreamクラスで行い、それをBufferedOutputStreamクラスでまとめて出力し、最後はFileOutputStreamクラスでファイルへと出力する。
ただし、この方法で出力したファイルはバイナリーファイルとなるため、ファイルからデータを取得するためにはDataInputStreamクラスで出力されている場合に限定される。
クラス丸ごと出力する場合には、出力用クラスにはObjectOutputStreamクラスを使用する。
ただし、この方法が有効なのは、出力するクラスが直列化可能であり、さらにファイルから取得するためにはObjectInputStreamクラスを使用する必要がある。
それ以外の目的の場合、対象に合わせた出力先ストリームクラスにBufferedOutputStreamクラスを接続し、byte型配列として出力する。
実際、バイナリーデータは様々な形式のデータであり、その変換には格納されているデータ毎に異なる処理が必要となる。そのため、データを適切な形式でbyte型配列に変換してから出力するのがいいだろう。
バイト出力ストリームは、バイトデータを出力するためのクラスである。
そのため、文字列やテキストファイルといった「文字列形式での出力」には向いていない。これら文字列の出力には文字出力ストリームを使用する。
ただし、PrintStreamクラスでも文字列形式で出力できるため、問題がなければPrintStreamクラスを使用してもよい。
// Sample.java
import java.io.IOException;
import java.io.EOFException;
import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedInputStream;
import java.io.DataOutputStream;
import java.io.DataInputStream;
public class Sample
{
public static void main( String[] args )
{
// 入出力ファイルの絶対パス。
// ファイルは存在しなくても構いません。
// というか存在すると上書きされます。
String filePath = "D:/test.data";
// 出力します。
// FileOutputStreamクラス等の参照型変数。
// ここで作っておくのはfinallyでclose()メソッドを呼ぶためです。
FileOutputStream fileOutputStream = null;
BufferedOutputStream bufferedOutputStream = null;
DataOutputStream dataOutputStream = null;
try
{
// FileOutputStreamクラスを作ります。
fileOutputStream = new FileOutputStream( filePath );
// そのクラスを対象とするBufferedOutputStreamクラスを作ります。
bufferedOutputStream = new BufferedOutputStream( fileOutputStream );
// そのクラスを対象とするBufferedOutputStreamクラスを作ります。
dataOutputStream = new DataOutputStream( bufferedOutputStream );
// ストリームを通して、データを書き込みます。
dataOutputStream.writeInt( 100 );
dataOutputStream.writeUTF( "あいうえお" );
dataOutputStream.writeBoolean( true );
}
catch( IOException e )
{
// ファイルが無かった場合等に、この
// IOException例外が投げられます。
e.printStackTrace();
return;
}
finally
{
// ストリームを扱ったら、最後にclose()メソッドを呼んで
// 後処理をします。また、これは必ず行うため、
// finally内で行います。
try
{
if( dataOutputStream != null )
{
dataOutputStream.close();
}
}
catch( IOException e )
{
// close()メソッドはIOExceptionがthrows指定されているので
// 一応受け取ります。
e.printStackTrace();
}
try
{
if( bufferedOutputStream != null )
{
bufferedOutputStream.close();
}
}
catch( IOException e )
{
e.printStackTrace();
}
try
{
if( fileOutputStream != null )
{
fileOutputStream.close();
}
}
catch( IOException e )
{
e.printStackTrace();
}
}
// 入力します。
// FileInputStreamクラス等の参照型変数。
// ここで作っておくのはfinallyでclose()メソッドを呼ぶためです。
FileInputStream fileInputStream = null;
BufferedInputStream bufferedInputStream = null;
DataInputStream dataInputStream = null;
try
{
// FileInputStreamクラスを作ります。
fileInputStream = new FileInputStream( filePath );
// そのクラスを対象とするBufferedInputStreamクラスを作ります。
bufferedInputStream = new BufferedInputStream( fileInputStream );
// そのクラスを対象とするDataInputStreamクラスを作ります。
dataInputStream = new DataInputStream( bufferedInputStream );
try
{
// データを読み込みます。
int i = dataInputStream.readInt();
String string = dataInputStream.readUTF();
boolean b = dataInputStream.readBoolean();
System.out.println( i );
System.out.println( string );
System.out.println( b );
// 100
// あいうえお
// true
// このように、test.dataファイルにバイナリーデータとして
// 書き込み、それを取得することができます。
// 逆に言えば、異なる形式で書き込まれたデータは取得できない
// ということです。DataOutputStreamクラスとDataInputStreamクラス
// は対であり、全然関係ないデータの取得にDataInputStreamクラスを
// 使用することはありません。
}
catch( EOFException e )
{
System.out.println( "ストリームの終端まで来ました。" );
// このように、ストリームの最後に来ると
// EOFExceptionが投げられます。
// 他のストリームの場合、戻り値に「ストリームの終端まで来た」
// ことを示す「-1」が返されるのですが、DataInputStreamクラスの
// 場合、プリミティブ型を返すのでそれができません。
// そのため、代わりにEOFException例外を投げるのです。
}
}
catch( IOException e )
{
// ファイルが無かった場合等に、この
// IOException例外が投げられます。
e.printStackTrace();
return;
}
finally
{
// ストリームを扱ったら、最後にclose()メソッドを呼んで
// 後処理をします。また、これは必ず行うため、
// finally内で行います。
try
{
if( dataInputStream != null )
{
dataInputStream.close();
}
}
catch( IOException e )
{
// close()メソッドはIOExceptionがthrows指定されているので
// 一応受け取ります。
e.printStackTrace();
}
try
{
if( bufferedInputStream != null )
{
bufferedInputStream.close();
}
}
catch( IOException e )
{
e.printStackTrace();
}
try
{
if( fileInputStream != null )
{
fileInputStream.close();
}
}
catch( IOException e )
{
e.printStackTrace();
}
}
}
}
import java.io.IOException;
import java.io.EOFException;
import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedInputStream;
import java.io.DataOutputStream;
import java.io.DataInputStream;
public class Sample
{
public static void main( String[] args )
{
// 入出力ファイルの絶対パス。
// ファイルは存在しなくても構いません。
// というか存在すると上書きされます。
String filePath = "D:/test.data";
// 出力します。
// FileOutputStreamクラス等の参照型変数。
// ここで作っておくのはfinallyでclose()メソッドを呼ぶためです。
FileOutputStream fileOutputStream = null;
BufferedOutputStream bufferedOutputStream = null;
DataOutputStream dataOutputStream = null;
try
{
// FileOutputStreamクラスを作ります。
fileOutputStream = new FileOutputStream( filePath );
// そのクラスを対象とするBufferedOutputStreamクラスを作ります。
bufferedOutputStream = new BufferedOutputStream( fileOutputStream );
// そのクラスを対象とするBufferedOutputStreamクラスを作ります。
dataOutputStream = new DataOutputStream( bufferedOutputStream );
// ストリームを通して、データを書き込みます。
dataOutputStream.writeInt( 100 );
dataOutputStream.writeUTF( "あいうえお" );
dataOutputStream.writeBoolean( true );
}
catch( IOException e )
{
// ファイルが無かった場合等に、この
// IOException例外が投げられます。
e.printStackTrace();
return;
}
finally
{
// ストリームを扱ったら、最後にclose()メソッドを呼んで
// 後処理をします。また、これは必ず行うため、
// finally内で行います。
try
{
if( dataOutputStream != null )
{
dataOutputStream.close();
}
}
catch( IOException e )
{
// close()メソッドはIOExceptionがthrows指定されているので
// 一応受け取ります。
e.printStackTrace();
}
try
{
if( bufferedOutputStream != null )
{
bufferedOutputStream.close();
}
}
catch( IOException e )
{
e.printStackTrace();
}
try
{
if( fileOutputStream != null )
{
fileOutputStream.close();
}
}
catch( IOException e )
{
e.printStackTrace();
}
}
// 入力します。
// FileInputStreamクラス等の参照型変数。
// ここで作っておくのはfinallyでclose()メソッドを呼ぶためです。
FileInputStream fileInputStream = null;
BufferedInputStream bufferedInputStream = null;
DataInputStream dataInputStream = null;
try
{
// FileInputStreamクラスを作ります。
fileInputStream = new FileInputStream( filePath );
// そのクラスを対象とするBufferedInputStreamクラスを作ります。
bufferedInputStream = new BufferedInputStream( fileInputStream );
// そのクラスを対象とするDataInputStreamクラスを作ります。
dataInputStream = new DataInputStream( bufferedInputStream );
try
{
// データを読み込みます。
int i = dataInputStream.readInt();
String string = dataInputStream.readUTF();
boolean b = dataInputStream.readBoolean();
System.out.println( i );
System.out.println( string );
System.out.println( b );
// 100
// あいうえお
// true
// このように、test.dataファイルにバイナリーデータとして
// 書き込み、それを取得することができます。
// 逆に言えば、異なる形式で書き込まれたデータは取得できない
// ということです。DataOutputStreamクラスとDataInputStreamクラス
// は対であり、全然関係ないデータの取得にDataInputStreamクラスを
// 使用することはありません。
}
catch( EOFException e )
{
System.out.println( "ストリームの終端まで来ました。" );
// このように、ストリームの最後に来ると
// EOFExceptionが投げられます。
// 他のストリームの場合、戻り値に「ストリームの終端まで来た」
// ことを示す「-1」が返されるのですが、DataInputStreamクラスの
// 場合、プリミティブ型を返すのでそれができません。
// そのため、代わりにEOFException例外を投げるのです。
}
}
catch( IOException e )
{
// ファイルが無かった場合等に、この
// IOException例外が投げられます。
e.printStackTrace();
return;
}
finally
{
// ストリームを扱ったら、最後にclose()メソッドを呼んで
// 後処理をします。また、これは必ず行うため、
// finally内で行います。
try
{
if( dataInputStream != null )
{
dataInputStream.close();
}
}
catch( IOException e )
{
// close()メソッドはIOExceptionがthrows指定されているので
// 一応受け取ります。
e.printStackTrace();
}
try
{
if( bufferedInputStream != null )
{
bufferedInputStream.close();
}
}
catch( IOException e )
{
e.printStackTrace();
}
try
{
if( fileInputStream != null )
{
fileInputStream.close();
}
}
catch( IOException e )
{
e.printStackTrace();
}
}
}
}
// Sample.java import java.io.IOException; import java.io.EOFException; import java.io.FileOutputStream; import java.io.FileInputStream; import java.io.BufferedOutputStream; import java.io.BufferedInputStream; import java.io.DataOutputStream; import java.io.DataInputStream; public class Sample { public static void main( String[] args ) { // 入出力ファイルの絶対パス。 // ファイルは存在しなくても構いません。 // というか存在すると上書きされます。 String filePath = "D:/test.data"; // 出力します。 // FileOutputStreamクラス等の参照型変数。 // ここで作っておくのはfinallyでclose()メソッドを呼ぶためです。 FileOutputStream fileOutputStream = null; BufferedOutputStream bufferedOutputStream = null; DataOutputStream dataOutputStream = null; try { // FileOutputStreamクラスを作ります。 fileOutputStream = new FileOutputStream( filePath ); // そのクラスを対象とするBufferedOutputStreamクラスを作ります。 bufferedOutputStream = new BufferedOutputStream( fileOutputStream ); // そのクラスを対象とするBufferedOutputStreamクラスを作ります。 dataOutputStream = new DataOutputStream( bufferedOutputStream ); // ストリームを通して、データを書き込みます。 dataOutputStream.writeInt( 100 ); dataOutputStream.writeUTF( "あいうえお" ); dataOutputStream.writeBoolean( true ); } catch( IOException e ) { // ファイルが無かった場合等に、この // IOException例外が投げられます。 e.printStackTrace(); return; } finally { // ストリームを扱ったら、最後にclose()メソッドを呼んで // 後処理をします。また、これは必ず行うため、 // finally内で行います。 try { if( dataOutputStream != null ) { dataOutputStream.close(); } } catch( IOException e ) { // close()メソッドはIOExceptionがthrows指定されているので // 一応受け取ります。 e.printStackTrace(); } try { if( bufferedOutputStream != null ) { bufferedOutputStream.close(); } } catch( IOException e ) { e.printStackTrace(); } try { if( fileOutputStream != null ) { fileOutputStream.close(); } } catch( IOException e ) { e.printStackTrace(); } } // 入力します。 // FileInputStreamクラス等の参照型変数。 // ここで作っておくのはfinallyでclose()メソッドを呼ぶためです。 FileInputStream fileInputStream = null; BufferedInputStream bufferedInputStream = null; DataInputStream dataInputStream = null; try { // FileInputStreamクラスを作ります。 fileInputStream = new FileInputStream( filePath ); // そのクラスを対象とするBufferedInputStreamクラスを作ります。 bufferedInputStream = new BufferedInputStream( fileInputStream ); // そのクラスを対象とするDataInputStreamクラスを作ります。 dataInputStream = new DataInputStream( bufferedInputStream ); try { // データを読み込みます。 int i = dataInputStream.readInt(); String string = dataInputStream.readUTF(); boolean b = dataInputStream.readBoolean(); System.out.println( i ); System.out.println( string ); System.out.println( b ); // 100 // あいうえお // true // このように、test.dataファイルにバイナリーデータとして // 書き込み、それを取得することができます。 // 逆に言えば、異なる形式で書き込まれたデータは取得できない // ということです。DataOutputStreamクラスとDataInputStreamクラス // は対であり、全然関係ないデータの取得にDataInputStreamクラスを // 使用することはありません。 } catch( EOFException e ) { System.out.println( "ストリームの終端まで来ました。" ); // このように、ストリームの最後に来ると // EOFExceptionが投げられます。 // 他のストリームの場合、戻り値に「ストリームの終端まで来た」 // ことを示す「-1」が返されるのですが、DataInputStreamクラスの // 場合、プリミティブ型を返すのでそれができません。 // そのため、代わりにEOFException例外を投げるのです。 } } catch( IOException e ) { // ファイルが無かった場合等に、この // IOException例外が投げられます。 e.printStackTrace(); return; } finally { // ストリームを扱ったら、最後にclose()メソッドを呼んで // 後処理をします。また、これは必ず行うため、 // finally内で行います。 try { if( dataInputStream != null ) { dataInputStream.close(); } } catch( IOException e ) { // close()メソッドはIOExceptionがthrows指定されているので // 一応受け取ります。 e.printStackTrace(); } try { if( bufferedInputStream != null ) { bufferedInputStream.close(); } } catch( IOException e ) { e.printStackTrace(); } try { if( fileInputStream != null ) { fileInputStream.close(); } } catch( IOException e ) { e.printStackTrace(); } } } }