JavaA2Z

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

InputStreamReader

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

解説

J2SEに含まれるクラスのひとつ。パッケージも含めたクラス名java.io.InputStreamReader。
ストリームクラスReaderクラスサブクラスであり、文字入力ストリームクラスである。
文字入力ストリームクラスの中では「中継ぎ」に位置する。
対になる出力側のクラスOutputStreamWriterクラスである。
 
文字入力ストリームの「中継ぎ」クラススーパークラス
「入力元」→「中継ぎ」→「取得用」という連携の中で、「入力元」にから取得した文字を書き換えたり、といった「中間位置での立ち回り」をクラスの、スーパークラスとなるクラスである。
ただし、InputStreamReaderクラスは「入力元」をバイト入力ストリーム、つまりInputStreamクラスに限定している。
つまり、InputStreamReaderクラスは、ReaderクラスサブクラスInputStreamクラスサブクラスの「仲介役」となるクラスである。
 
文字は、バイナリーデータの一種である。
文字入力ストリームは、バイト入力ストリームの一種である、ということが言える。
そのため、文字入力ストリームバイト入力ストリームへと変換し渡す必要がある場合がある。その時に使用するのがInputStreamReaderクラスである。
InputStreamReaderクラスInputStreamクラスサブクラスを受け取り、inフィールドに持つ。
read()メソッドが呼び出されると、inフィールドのread()メソッド呼び出しバイト入力ストリームから数バイト取得し、指定された文字コード(指定されていない場合にはOS標準の文字コード)の形式で文字列へと変換し返す。
つまり、「文字列」というデータを、特定文字コードの「byte配列」とみなして、バイト入力ストリームから取得するのがInputStreamReaderクラスの役目である。
  
InputStreamReaderクラスコンストラクタに「入力元」となるInputStreamクラスサブクラスを渡す。また、任意の文字コードに変換する場合には、第2引数文字コードを指定する。指定されなかった場合には、OS標準の文字コードに変換する。たとえばWindowsであればCP932に変換することになる。
InputStreamReaderクラスのread()メソッド呼び出すと、コンストラクタで渡された「入力元」InputStreamクラスのread()メソッド呼び出し、数バイト取得して、指定された文字コード文字に変換してから返す。
処理終了後はclose()メソッドを呼び終了処理をう。

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

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

// Sample.java
import java.io.ByteArrayInputStream;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.UnsupportedEncodingException;

public class Sample
{
    public static void main( String[] args )
    {
        ByteArrayInputStream byteArrayInputStream = null;
        InputStreamReader inputStreamReader = null;
        BufferedReader bufferedReader = null;
        try
        {
            // 処理対象のバイト配列。
            // UTF-8の"あいう"です(UTF-8なのは、InputStreamReaderクラスの
            // コンストラクタでそう指定しているからです)。
            byte[] bytes = new byte[]
                { (byte)0xe3   // 「あ」の1バイト目。
                , (byte)0x81   // 「あ」の2バイト目。
                , (byte)0x82   // 「あ」の3バイト目。
                , (byte)0xe3   // 「い」の1バイト目。
                , (byte)0x81   // 「い」の2バイト目。
                , (byte)0x84   // 「い」の3バイト目。
                , (byte)0xe3   // 「う」の1バイト目。
                , (byte)0x81   // 「う」の2バイト目。
                , (byte)0x86   // 「う」の3バイト目。
                };

            // そのバイト配列を読み込み対象とする
            // ByteArrayInputStreamクラスを用意します。
            byteArrayInputStream = new ByteArrayInputStream( bytes );

            // このクラスを対象とするInputStreamReaderクラスを用意します。
            // 対象のバイト入力ストリームには文字コードがUTF-8で入っているので、
            // "UTF-8"を指定します。
            inputStreamReader = new InputStreamReader( byteArrayInputStream, "UTF-8" );

            // このクラスを対象とするBufferedReaderクラスを用意します。
            bufferedReader = new BufferedReader( inputStreamReader );

            // つまり、

            // ByteArrayInputStream
            // ↓
            // InputStreamReader
            // ↓
            // BufferedReader

            // という形で、バイト入力ストリームクラスと
            // 文字入力ストリームクラスが連結したことになります。

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

                // 出力します。
                System.out.println( (char)i );
            }
            // あ
            // い
            // う

            // このように、bufferedReaderのread()メソッドを呼ぶと、
            // inputStreamReaderのread()メソッドを呼び出し、さらに
            // byteArrayInputStreamのread()メソッドを呼び出します。
            // つまり文字入力ストリームとバイト入力ストリームが連結して
            // 「チェーン」になったというわけです。
            // また、入力する際、バイト入力ストリームに「指定した文字コードで
            // 書き込まれている」と見なして、変換して文字として取得
            // しています。
            
        }
        catch( UnsupportedEncodingException e )
        {
            // 指定した文字コードが存在しない場合には
            // UnsupportedEncodingException例外が投げられます。
            e.printStackTrace();
        }
        catch( IOException e )
        {
            // 読み込みに失敗した際に、read()メソッドが
            // IOException例外を投げます。
            e.printStackTrace();
        }
        finally
        {
            // 処理が終わったら、最後にclose()メソッドを呼んで
            // 後処理をします。また、これは必ず行うため、
            // finally内で行います。
            try
            {
                if( bufferedReader != null )
                {
                    bufferedReader.close();
                }
            }
            catch( IOException e )
            {
                // close()メソッドはIOExceptionがthrows指定されているので
                // 一応受け取ります。
                e.printStackTrace();
            }

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

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

public class Sample
{
    public static void main( String[] args )
    {
        ByteArrayInputStream byteArrayInputStream = null;
        InputStreamReader inputStreamReader = null;
        BufferedReader bufferedReader = null;
        try
        {
            // 処理対象のバイト配列。
            // UTF-8の"あいう"です(UTF-8なのは、InputStreamReaderクラスの
            // コンストラクタでそう指定しているからです)。
            byte[] bytes = new byte[]
                { (byte)0xe3   // 「あ」の1バイト目。
                , (byte)0x81   // 「あ」の2バイト目。
                , (byte)0x82   // 「あ」の3バイト目。
                , (byte)0xe3   // 「い」の1バイト目。
                , (byte)0x81   // 「い」の2バイト目。
                , (byte)0x84   // 「い」の3バイト目。
                , (byte)0xe3   // 「う」の1バイト目。
                , (byte)0x81   // 「う」の2バイト目。
                , (byte)0x86   // 「う」の3バイト目。
                };

            // そのバイト配列を読み込み対象とする
            // ByteArrayInputStreamクラスを用意します。
            byteArrayInputStream = new ByteArrayInputStream( bytes );

            // このクラスを対象とするInputStreamReaderクラスを用意します。
            // 対象のバイト入力ストリームには文字コードがUTF-8で入っているので、
            // "UTF-8"を指定します。
            inputStreamReader = new InputStreamReader( byteArrayInputStream, "UTF-8" );

            // このクラスを対象とするBufferedReaderクラスを用意します。
            bufferedReader = new BufferedReader( inputStreamReader );

            // つまり、

            // ByteArrayInputStream
            // ↓
            // InputStreamReader
            // ↓
            // BufferedReader

            // という形で、バイト入力ストリームクラスと
            // 文字入力ストリームクラスが連結したことになります。

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

                // 出力します。
                System.out.println( (char)i );
            }
            // あ
            // い
            // う

            // このように、bufferedReaderのread()メソッドを呼ぶと、
            // inputStreamReaderのread()メソッドを呼び出し、さらに
            // byteArrayInputStreamのread()メソッドを呼び出します。
            // つまり文字入力ストリームとバイト入力ストリームが連結して
            // 「チェーン」になったというわけです。
            // また、入力する際、バイト入力ストリームに「指定した文字コードで
            // 書き込まれている」と見なして、変換して文字として取得
            // しています。
            
        }
        catch( UnsupportedEncodingException e )
        {
            // 指定した文字コードが存在しない場合には
            // UnsupportedEncodingException例外が投げられます。
            e.printStackTrace();
        }
        catch( IOException e )
        {
            // 読み込みに失敗した際に、read()メソッドが
            // IOException例外を投げます。
            e.printStackTrace();
        }
        finally
        {
            // 処理が終わったら、最後にclose()メソッドを呼んで
            // 後処理をします。また、これは必ず行うため、
            // finally内で行います。
            try
            {
                if( bufferedReader != null )
                {
                    bufferedReader.close();
                }
            }
            catch( IOException e )
            {
                // close()メソッドはIOExceptionがthrows指定されているので
                // 一応受け取ります。
                e.printStackTrace();
            }

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

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

この単語を含むページ

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

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