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()メソッドを呼び終了処理を行う。
ストリームクラス。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()メソッドを呼び終了処理を行う。
// 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();
}
}
}
}
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(); } } } }