DataInputStream
日本語 | 情報入力流れ |
英語 | data input stream |
ふりがな | でーたいんぷっとすとりーむ |
フリガナ | データインプットストリーム |
J2SEに含まれるクラスのひとつ。パッケージも含めたクラス名はjava.io.DataInputStream。
ストリームクラス。InputStreamクラスのサブクラスであり、バイト入力ストリームクラスである。
FilterInputStreamクラスのサブクラスに当たり、バイト入力ストリームクラスの中では「取得用」に位置する。
対になる出力側のクラスはDataOutputStreamクラスである。
ストリーム中のバイトデータに「プリミティブ型」や「文字列」が格納されていると見なして取り出すためのバイト入力ストリームクラス。
通常、バイト入力ストリームは対象を「バイトの並び」と見なして1バイトずつ取得する。
DataInputStreamクラスは、その「バイトの並び」に「プリミティブ型」や「文字列型」がバイナリー形式で書き込まれているとみなして取得する。
取得対象は、必ずDataOutputStreamクラスで書き込んだものである必要がある。
つまり、DataInputStreamクラスとDataOutputStreamクラスは対にして使用するものであり、DataInputStreamクラスは、たとえばテキストファイルといった「DataOutputStreamクラス以外によって作られたデータ」から取得することはできない。
DataInputStreamクラスは他のバイト入力ストリームクラスに比べて「プリミティブ型や文字列を直接取得できる」というメリットがありそうに見えるが、そのためには出力時にDataOutputStreamクラスを使用しなければいけない。
そのため、アプリケーションの独自フォーマットで保存する場合にのみメリットがある、ということである。
DataInputStreamクラスのコンストラクタに他のInputStreamクラスのサブクラスを渡すことで、そのクラスを「入力元」として取得する。
DataInputStreamクラスのreadInt()メソッド、readDouble()メソッド、readUTF()メソッド等によって、プリミティブ型や文字列を直接取得できる。ただし、必ずDataInputStreamクラスのwriteInt()メソッド、writeDouble()メソッド、writeUTF()メソッド等で書き込んでいる必要がある。型と順番を合わせなければ、適切なデータを取得することはできない。
ストリームの終端に達した際には、EOFException例外が投げられる。他のバイト入力ストリームクラスは、終端に達すると「-1」が返されるが、DataInputStreamクラスのreadInt()メソッド、readDouble()メソッド、readUTF()メソッド等は「返しようがない」ため、終端ではEOFException例外を投げるようになっている。
処理終了後はclose()メソッドを呼び終了処理を行う。
ストリームクラス。InputStreamクラスのサブクラスであり、バイト入力ストリームクラスである。
FilterInputStreamクラスのサブクラスに当たり、バイト入力ストリームクラスの中では「取得用」に位置する。
対になる出力側のクラスはDataOutputStreamクラスである。
ストリーム中のバイトデータに「プリミティブ型」や「文字列」が格納されていると見なして取り出すためのバイト入力ストリームクラス。
通常、バイト入力ストリームは対象を「バイトの並び」と見なして1バイトずつ取得する。
DataInputStreamクラスは、その「バイトの並び」に「プリミティブ型」や「文字列型」がバイナリー形式で書き込まれているとみなして取得する。
取得対象は、必ずDataOutputStreamクラスで書き込んだものである必要がある。
つまり、DataInputStreamクラスとDataOutputStreamクラスは対にして使用するものであり、DataInputStreamクラスは、たとえばテキストファイルといった「DataOutputStreamクラス以外によって作られたデータ」から取得することはできない。
DataInputStreamクラスは他のバイト入力ストリームクラスに比べて「プリミティブ型や文字列を直接取得できる」というメリットがありそうに見えるが、そのためには出力時にDataOutputStreamクラスを使用しなければいけない。
そのため、アプリケーションの独自フォーマットで保存する場合にのみメリットがある、ということである。
DataInputStreamクラスのコンストラクタに他のInputStreamクラスのサブクラスを渡すことで、そのクラスを「入力元」として取得する。
DataInputStreamクラスのreadInt()メソッド、readDouble()メソッド、readUTF()メソッド等によって、プリミティブ型や文字列を直接取得できる。ただし、必ずDataInputStreamクラスのwriteInt()メソッド、writeDouble()メソッド、writeUTF()メソッド等で書き込んでいる必要がある。型と順番を合わせなければ、適切なデータを取得することはできない。
ストリームの終端に達した際には、EOFException例外が投げられる。他のバイト入力ストリームクラスは、終端に達すると「-1」が返されるが、DataInputStreamクラスのreadInt()メソッド、readDouble()メソッド、readUTF()メソッド等は「返しようがない」ため、終端ではEOFException例外を投げるようになっている。
処理終了後はclose()メソッドを呼び終了処理を行う。
// Sample.java
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.EOFException;
public class Sample
{
public static void main( String[] args )
{
ByteArrayOutputStream byteArrayOutputStream = null;
DataOutputStream dataOutputStream = null;
ByteArrayInputStream byteArrayInputStream = null;
DataInputStream dataInputStream = null;
try
{
// まずは出力します。
// 出力先のByteArrayOutputStreamクラスを作ります。
byteArrayOutputStream = new ByteArrayOutputStream();
// これを出力先とするDataOutputStreamクラスを作ります。
dataOutputStream = new DataOutputStream( byteArrayOutputStream );
// ストリームを通して、データを書き込みます。
dataOutputStream.writeInt( 100 );
dataOutputStream.writeUTF( "あいうえお" );
dataOutputStream.writeInt( 200);
// 書き込まれたバイトデータをbyte型配列として取得します。
byte[] bytes = byteArrayOutputStream.toByteArray();
// 参考用に、byte型配列の中身を出力します。
for( int iF1 = 0; iF1 < bytes.length; ++iF1 )
{
System.out.print( Integer.toHexString( 0x000000FF & (int)bytes[iF1] ) + ", " );
}
System.out.println();
// 0, 0, 0, 64, 0, f, e3, 81, 82, e3, 81, 84, e3, 81, 86, e3, 81, 88, e3, 81, 8a, 0, 0, 0, c8,
// ← 100 → ↑ ← あいうえお(UTF-8) → ← 200 →
// ↑「あいうえお」のバイト数
// それを読み込みます。
// 入力元のByteArrayInputStreamクラスを作ります。
byteArrayInputStream = new ByteArrayInputStream( bytes );
// これを入力元とするDataOutputStreamクラスを作ります。
dataInputStream = new DataInputStream( byteArrayInputStream );
try
{
// データを読み込みます。
int i1 = dataInputStream.readInt();
String string = dataInputStream.readUTF();
int i2 = dataInputStream.readInt();
System.out.println( i1 );
System.out.println( string );
System.out.println( i2 );
// 100
// あいうえお
// 200
// 最後まで来てるのに読み込もうとすると、
// EOFException例外が投げられます。
char ch = dataInputStream.readChar();
}
catch( EOFException e )
{
System.out.println( "ストリームの終端まで来ました。" );
// このように、ストリームの最後に来ると
// EOFExceptionが投げられます。
// 他のストリームの場合、戻り値に「ストリームの終端まで来た」
// ことを示す「-1」が返されるのですが、DataInputStreamクラスの
// 場合、プリミティブ型を返すのでそれができません。
// そのため、代わりにEOFException例外を投げるのです。
}
}
catch( IOException e )
{
// 入出力に失敗した場合等に、このIOException例外が投げられます。
e.printStackTrace();
}
finally
{
// ストリームを扱ったら、最後にclose()メソッドを呼んで
// 後処理をします。また、これは必ず行うため、
// finally内で行います。
try
{
if( dataInputStream != null )
{
dataInputStream.close();
}
}
catch( IOException e )
{
// close()メソッドはIOExceptionがthrows指定されているので
// 一応受け取ります。
e.printStackTrace();
}
try
{
if( byteArrayInputStream != null )
{
byteArrayInputStream.close();
}
}
catch( IOException e )
{
e.printStackTrace();
}
try
{
if( dataOutputStream != null )
{
dataOutputStream.close();
}
}
catch( IOException e )
{
e.printStackTrace();
}
try
{
if( byteArrayOutputStream != null )
{
byteArrayOutputStream.close();
}
}
catch( IOException e )
{
e.printStackTrace();
}
}
}
}
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.EOFException;
public class Sample
{
public static void main( String[] args )
{
ByteArrayOutputStream byteArrayOutputStream = null;
DataOutputStream dataOutputStream = null;
ByteArrayInputStream byteArrayInputStream = null;
DataInputStream dataInputStream = null;
try
{
// まずは出力します。
// 出力先のByteArrayOutputStreamクラスを作ります。
byteArrayOutputStream = new ByteArrayOutputStream();
// これを出力先とするDataOutputStreamクラスを作ります。
dataOutputStream = new DataOutputStream( byteArrayOutputStream );
// ストリームを通して、データを書き込みます。
dataOutputStream.writeInt( 100 );
dataOutputStream.writeUTF( "あいうえお" );
dataOutputStream.writeInt( 200);
// 書き込まれたバイトデータをbyte型配列として取得します。
byte[] bytes = byteArrayOutputStream.toByteArray();
// 参考用に、byte型配列の中身を出力します。
for( int iF1 = 0; iF1 < bytes.length; ++iF1 )
{
System.out.print( Integer.toHexString( 0x000000FF & (int)bytes[iF1] ) + ", " );
}
System.out.println();
// 0, 0, 0, 64, 0, f, e3, 81, 82, e3, 81, 84, e3, 81, 86, e3, 81, 88, e3, 81, 8a, 0, 0, 0, c8,
// ← 100 → ↑ ← あいうえお(UTF-8) → ← 200 →
// ↑「あいうえお」のバイト数
// それを読み込みます。
// 入力元のByteArrayInputStreamクラスを作ります。
byteArrayInputStream = new ByteArrayInputStream( bytes );
// これを入力元とするDataOutputStreamクラスを作ります。
dataInputStream = new DataInputStream( byteArrayInputStream );
try
{
// データを読み込みます。
int i1 = dataInputStream.readInt();
String string = dataInputStream.readUTF();
int i2 = dataInputStream.readInt();
System.out.println( i1 );
System.out.println( string );
System.out.println( i2 );
// 100
// あいうえお
// 200
// 最後まで来てるのに読み込もうとすると、
// EOFException例外が投げられます。
char ch = dataInputStream.readChar();
}
catch( EOFException e )
{
System.out.println( "ストリームの終端まで来ました。" );
// このように、ストリームの最後に来ると
// EOFExceptionが投げられます。
// 他のストリームの場合、戻り値に「ストリームの終端まで来た」
// ことを示す「-1」が返されるのですが、DataInputStreamクラスの
// 場合、プリミティブ型を返すのでそれができません。
// そのため、代わりにEOFException例外を投げるのです。
}
}
catch( IOException e )
{
// 入出力に失敗した場合等に、このIOException例外が投げられます。
e.printStackTrace();
}
finally
{
// ストリームを扱ったら、最後にclose()メソッドを呼んで
// 後処理をします。また、これは必ず行うため、
// finally内で行います。
try
{
if( dataInputStream != null )
{
dataInputStream.close();
}
}
catch( IOException e )
{
// close()メソッドはIOExceptionがthrows指定されているので
// 一応受け取ります。
e.printStackTrace();
}
try
{
if( byteArrayInputStream != null )
{
byteArrayInputStream.close();
}
}
catch( IOException e )
{
e.printStackTrace();
}
try
{
if( dataOutputStream != null )
{
dataOutputStream.close();
}
}
catch( IOException e )
{
e.printStackTrace();
}
try
{
if( byteArrayOutputStream != null )
{
byteArrayOutputStream.close();
}
}
catch( IOException e )
{
e.printStackTrace();
}
}
}
}
// Sample.java import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; import java.io.ByteArrayInputStream; import java.io.DataInputStream; import java.io.IOException; import java.io.EOFException; public class Sample { public static void main( String[] args ) { ByteArrayOutputStream byteArrayOutputStream = null; DataOutputStream dataOutputStream = null; ByteArrayInputStream byteArrayInputStream = null; DataInputStream dataInputStream = null; try { // まずは出力します。 // 出力先のByteArrayOutputStreamクラスを作ります。 byteArrayOutputStream = new ByteArrayOutputStream(); // これを出力先とするDataOutputStreamクラスを作ります。 dataOutputStream = new DataOutputStream( byteArrayOutputStream ); // ストリームを通して、データを書き込みます。 dataOutputStream.writeInt( 100 ); dataOutputStream.writeUTF( "あいうえお" ); dataOutputStream.writeInt( 200); // 書き込まれたバイトデータをbyte型配列として取得します。 byte[] bytes = byteArrayOutputStream.toByteArray(); // 参考用に、byte型配列の中身を出力します。 for( int iF1 = 0; iF1 < bytes.length; ++iF1 ) { System.out.print( Integer.toHexString( 0x000000FF & (int)bytes[iF1] ) + ", " ); } System.out.println(); // 0, 0, 0, 64, 0, f, e3, 81, 82, e3, 81, 84, e3, 81, 86, e3, 81, 88, e3, 81, 8a, 0, 0, 0, c8, // ← 100 → ↑ ← あいうえお(UTF-8) → ← 200 → // ↑「あいうえお」のバイト数 // それを読み込みます。 // 入力元のByteArrayInputStreamクラスを作ります。 byteArrayInputStream = new ByteArrayInputStream( bytes ); // これを入力元とするDataOutputStreamクラスを作ります。 dataInputStream = new DataInputStream( byteArrayInputStream ); try { // データを読み込みます。 int i1 = dataInputStream.readInt(); String string = dataInputStream.readUTF(); int i2 = dataInputStream.readInt(); System.out.println( i1 ); System.out.println( string ); System.out.println( i2 ); // 100 // あいうえお // 200 // 最後まで来てるのに読み込もうとすると、 // EOFException例外が投げられます。 char ch = dataInputStream.readChar(); } catch( EOFException e ) { System.out.println( "ストリームの終端まで来ました。" ); // このように、ストリームの最後に来ると // EOFExceptionが投げられます。 // 他のストリームの場合、戻り値に「ストリームの終端まで来た」 // ことを示す「-1」が返されるのですが、DataInputStreamクラスの // 場合、プリミティブ型を返すのでそれができません。 // そのため、代わりにEOFException例外を投げるのです。 } } catch( IOException e ) { // 入出力に失敗した場合等に、このIOException例外が投げられます。 e.printStackTrace(); } finally { // ストリームを扱ったら、最後にclose()メソッドを呼んで // 後処理をします。また、これは必ず行うため、 // finally内で行います。 try { if( dataInputStream != null ) { dataInputStream.close(); } } catch( IOException e ) { // close()メソッドはIOExceptionがthrows指定されているので // 一応受け取ります。 e.printStackTrace(); } try { if( byteArrayInputStream != null ) { byteArrayInputStream.close(); } } catch( IOException e ) { e.printStackTrace(); } try { if( dataOutputStream != null ) { dataOutputStream.close(); } } catch( IOException e ) { e.printStackTrace(); } try { if( byteArrayOutputStream != null ) { byteArrayOutputStream.close(); } } catch( IOException e ) { e.printStackTrace(); } } } }