JavaA2Z

KAB-studio > プログラミング > JavaA2Z > DataInputStreamとは

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()メソッドを呼び終了処理をう。

(KAB-studioからのおしらせです)

サンプルプログラム(とか)サンプルを別ウィンドウで表示サンプルをクリップボードへコピー(WindowsでIEの場合のみ)

// 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型配列の中身を出力します。
            forint 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();
            }
        }
    }
}

この単語を含むページ

「みだし」に含まれているページ

「サンプルプログラムとか」に含まれているページ

はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
Yahoo!ブックマーク 詳細を表示 users
del.icio.us 登録する RSSに登録
サンプルを別ウィンドウで表示
サンプルをクリップボードへコピー(WindowsでIEの場合のみ)
update:2005/11/07
このページは、Javaプログラミング言語についての用語を網羅した辞書「JavaA2Z」の一ページです。
詳しくは「JavaA2Z」表紙の説明をご覧ください。