JavaA2Z

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

InputStream

日本語 入力流れ
英語 input stream
ふりがな いんぷっとすとりーむ
フリガナ インプットストリーム

解説

J2SEに含まれるクラスのひとつ。パッケージも含めたクラス名java.io.InputStream。
ストリームクラス。全てのバイト入力ストリームクラススーパークラスである。
バイト入力ストリームクラスの中では「入力元」に位置する。
対になる出力側のクラスOutputStreamクラスである。
 
全てのバイト入力ストリームクラススーパークラス
言い換えると、InputStreamクラスサブクラスバイト入力ストリームクラスである、ということになる。
そういったスーパークラスとしての役目だけ持つため、このクラスを直接使用することはない。このクラスサブクラスを使用するか、もしくはサブクラスを作成して使用する。
そもそも抽象クラスであるため、インスタンスを作成することはできない。
基本的には、「入力元」となるクラスはこのInputStreamクラスサブクラスとし、「中継ぎ」となるクラスFilterInputStreamクラスサブクラスとする。
 
InputStreamクラスサブクラスを作成する場合、まず「本当の入力元」を用意する。「本当の入力元」は、byte配列であったり、ファイルであったり、ソケットであったりする。そういった「一に並べられたbyteデータ」を「本当の入力元」とする。
他のバイト入力ストリームクラスを「入力元」としてもいいが、それであればInputStreamクラスではなくFileInputStreamクラスサブクラスとした方がいいだろう。
 
InputStreamクラス抽象クラスであり、read()メソッド抽象メソッドであるため、サブクラスは必ずread()メソッドオーバーライドする必要がある。
read()メソッドでは、「本当の入力元」から1バイト取得し返すよう実装する。取得したbyteのデータは、「バイトデータとしては同じ」ようになるようintキャストし返す。つまり、取得した値が-1(0xFF)であれば、それをintとしては255(0xFF)になるようキャストして返す。read()メソッドはあくまで「バイトデータ」を返すメソッドだからである。
read()メソッドでは、バイトストリームの最後に達した場合に「-1」を返す。
 
InputStreamクラスのその他のメソッドも、必要であればオーバーライドする。
特にclose()メソッドは「終了処理」をメソッドであり、ファイルソケットといった、最後に「閉じる」処理が必要な「本当の入力元」の場合には必ずclose()メソッドオーバーライドし、使用時にはfinally呼び出すようにする。

参考サイト


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

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

// Sample.java
import java.io.InputStream;
import java.io.PushbackInputStream;
import java.io.IOException;

public class Sample
{
    public static void main( String[] args )
    {
        NormalInputStream normalInputStream = null;
        PushbackInputStream pushbackInputStream = null;
        try
        {
            // NormalInputStreamクラスを作ります。
            // 本当の「入力元」はないので、単独で作ります。
            normalInputStream = new NormalInputStream();

            // このクラスを対象とするPushbackInputStreamクラスを用意します。
            pushbackInputStream = new PushbackInputStream( normalInputStream );

            while( true )
            {
                // 1バイト取得します。
                int i = pushbackInputStream.read();
                if( i == -1 )
                {
                    // -1が返されてきたら終わりです。
                    break;
                }

                // 出力します。
                System.out.println( "0x" + Integer.toHexString( i ) + " ( " + i + " )" );
            }
            // NormalInputStream#read() : 1
            // 0x1 ( 1 )
            // NormalInputStream#read() : 2
            // 0x2 ( 2 )
            // NormalInputStream#read() : 3
            // 0x3 ( 3 )
            // NormalInputStream#read() : 4

            // このように、pushbackInputStreamのread()メソッドを呼ぶと、
            // normalInputStreamのread()メソッドを呼び出します。
        }
        catch( IOException e )
        {
            // 読み込みに失敗した際に、read()メソッドが
            // IOException例外を投げます。
            e.printStackTrace();
        }
        finally
        {
            // 処理が終わったら、最後にclose()メソッドを呼んで
            // 後処理をします。また、これは必ず行うため、
            // finally内で行います。
            try
            {
                if( pushbackInputStream != null )
                {
                    pushbackInputStream.close();
                }
            }
            catch( IOException e )
            {
                // close()メソッドはIOExceptionがthrows指定されているので
                // 一応受け取ります。
                e.printStackTrace();
            }

            // 処理が終わったら、最後にclose()メソッドを呼んで
            // 後処理をします。また、これは必ず行うため、
            // finally内で行います。
            try
            {
                if( normalInputStream != null )
                {
                    normalInputStream.close();
                }
            }
            catch( IOException e )
            {
                // close()メソッドはIOExceptionがthrows指定されているので
                // 一応受け取ります。
                e.printStackTrace();
            }
        }
    }
}

/**
*   NormalInputStreamクラス。
*   InputStreamクラスのサブクラスです。
*/
class NormalInputStream extends InputStream
{
    // カウンター。
    private int counter = 1;
    
    /**
    *   read()メソッド。
    *   InputStreamクラスのread()メソッドをオーバーライドしたものです。
    *   このクラスを利用するバイト入力ストリームクラスの
    *   read()メソッドから呼び出されます。
    */
    public int read() throws IOException
    {
        System.out.println( "NormalInputStream#read() : " + counter );

        // カウンターの最大値を3にします。
        if( counter > 3 )
        {
            // 3を超えたら「最後」の印として-1を返します。
            return -1;
        }

        // カウンターの数を返します。
        // 通常は、こればbyte型の配列だったり、ファイルだったり
        // するわけです。
        int i = counter;
        ++counter;
        return i;
    }
}
// Sample.java
import java.io.InputStream;
import java.io.PushbackInputStream;
import java.io.IOException;

public class Sample
{
    public static void main( String[] args )
    {
        NormalInputStream normalInputStream = null;
        PushbackInputStream pushbackInputStream = null;
        try
        {
            // NormalInputStreamクラスを作ります。
            // 本当の「入力元」はないので、単独で作ります。
            normalInputStream = new NormalInputStream();

            // このクラスを対象とするPushbackInputStreamクラスを用意します。
            pushbackInputStream = new PushbackInputStream( normalInputStream );

            while( true )
            {
                // 1バイト取得します。
                int i = pushbackInputStream.read();
                if( i == -1 )
                {
                    // -1が返されてきたら終わりです。
                    break;
                }

                // 出力します。
                System.out.println( "0x" + Integer.toHexString( i ) + " ( " + i + " )" );
            }
            // NormalInputStream#read() : 1
            // 0x1 ( 1 )
            // NormalInputStream#read() : 2
            // 0x2 ( 2 )
            // NormalInputStream#read() : 3
            // 0x3 ( 3 )
            // NormalInputStream#read() : 4

            // このように、pushbackInputStreamのread()メソッドを呼ぶと、
            // normalInputStreamのread()メソッドを呼び出します。
        }
        catch( IOException e )
        {
            // 読み込みに失敗した際に、read()メソッドが
            // IOException例外を投げます。
            e.printStackTrace();
        }
        finally
        {
            // 処理が終わったら、最後にclose()メソッドを呼んで
            // 後処理をします。また、これは必ず行うため、
            // finally内で行います。
            try
            {
                if( pushbackInputStream != null )
                {
                    pushbackInputStream.close();
                }
            }
            catch( IOException e )
            {
                // close()メソッドはIOExceptionがthrows指定されているので
                // 一応受け取ります。
                e.printStackTrace();
            }

            // 処理が終わったら、最後にclose()メソッドを呼んで
            // 後処理をします。また、これは必ず行うため、
            // finally内で行います。
            try
            {
                if( normalInputStream != null )
                {
                    normalInputStream.close();
                }
            }
            catch( IOException e )
            {
                // close()メソッドはIOExceptionがthrows指定されているので
                // 一応受け取ります。
                e.printStackTrace();
            }
        }
    }
}

/**
*   NormalInputStreamクラス。
*   InputStreamクラスのサブクラスです。
*/
class NormalInputStream extends InputStream
{
    // カウンター。
    private int counter = 1;
    
    /**
    *   read()メソッド。
    *   InputStreamクラスのread()メソッドをオーバーライドしたものです。
    *   このクラスを利用するバイト入力ストリームクラスの
    *   read()メソッドから呼び出されます。
    */
    public int read() throws IOException
    {
        System.out.println( "NormalInputStream#read() : " + counter );

        // カウンターの最大値を3にします。
        if( counter > 3 )
        {
            // 3を超えたら「最後」の印として-1を返します。
            return -1;
        }

        // カウンターの数を返します。
        // 通常は、こればbyte型の配列だったり、ファイルだったり
        // するわけです。
        int i = counter;
        ++counter;
        return i;
    }
}

この単語を含むページ

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