FilterReader
| 日本語 | 濾過読者 |
| 英語 | filter reader |
| ふりがな | ふぃるたーりーだー |
| フリガナ | フィルターリーダー |
J2SEに含まれるクラスのひとつ。パッケージも含めたクラス名はjava.io.FilterReader。
ストリームクラス。Readerクラスのサブクラスであり、文字入力ストリームクラスである。
文字入力ストリームクラスの中では「中継ぎ」に位置する。
対になる出力側のクラスはFilterWriterクラスである。
文字入力ストリームの「中継ぎ」クラスのスーパークラス。
「入力元」→「中継ぎ」→「取得用」という連携の中で、「入力元」から取得した文字データを書き換えたり、「取得用」からの取得指示に対して特殊な方法で取得する、といった「中間位置での立ち回り」を行うクラスの、スーパークラスとなるクラスである。
そういったスーパークラスとしての役目だけ持つため、このクラスのみを単独で使用することはない。このクラスのサブクラスを使用するか、もしくはサブクラスを作成して使用する。
サブクラスにはPushbackReaderクラスがある。
FilterReaderクラスのサブクラスを作成する場合、まずコンストラクタでReaderクラスを引数に受け取り、FilterReaderクラスのコンストラクタに渡す。そうすることで、FilterReaderクラスのinフィールドにこのReaderクラスが格納される。このReaderクラスは「入力元」に当たる。
その後、任意の(可能なら全ての)read()メソッドをオーバーロードする。基本的には、inフィールドのread()メソッドを呼び出して「入力元」から文字ストリームを取得し、そのまま返す。ただし、このサブクラスで行いたい機能によっては、この取得した文字ストリームを加工したり、別の文字ストリームから値を返すようにする。。
read()メソッドは、このサブクラスを他の「中継ぎ」クラスもしくは「取得用」クラスに渡した場合、そのread()メソッドから呼び出される。
つまり、「取得用」→「中継ぎ」→「入力元」の順でread()メソッドを呼び出していき、その逆方向に値を返していく。
ストリームクラス。Readerクラスのサブクラスであり、文字入力ストリームクラスである。
文字入力ストリームクラスの中では「中継ぎ」に位置する。
対になる出力側のクラスはFilterWriterクラスである。
文字入力ストリームの「中継ぎ」クラスのスーパークラス。
「入力元」→「中継ぎ」→「取得用」という連携の中で、「入力元」から取得した文字データを書き換えたり、「取得用」からの取得指示に対して特殊な方法で取得する、といった「中間位置での立ち回り」を行うクラスの、スーパークラスとなるクラスである。
そういったスーパークラスとしての役目だけ持つため、このクラスのみを単独で使用することはない。このクラスのサブクラスを使用するか、もしくはサブクラスを作成して使用する。
サブクラスにはPushbackReaderクラスがある。
FilterReaderクラスのサブクラスを作成する場合、まずコンストラクタでReaderクラスを引数に受け取り、FilterReaderクラスのコンストラクタに渡す。そうすることで、FilterReaderクラスのinフィールドにこのReaderクラスが格納される。このReaderクラスは「入力元」に当たる。
その後、任意の(可能なら全ての)read()メソッドをオーバーロードする。基本的には、inフィールドのread()メソッドを呼び出して「入力元」から文字ストリームを取得し、そのまま返す。ただし、このサブクラスで行いたい機能によっては、この取得した文字ストリームを加工したり、別の文字ストリームから値を返すようにする。。
read()メソッドは、このサブクラスを他の「中継ぎ」クラスもしくは「取得用」クラスに渡した場合、そのread()メソッドから呼び出される。
つまり、「取得用」→「中継ぎ」→「入力元」の順でread()メソッドを呼び出していき、その逆方向に値を返していく。
// Sample.java
import java.io.Reader;
import java.io.StringReader;
import java.io.PushbackReader;
import java.io.FilterReader;
import java.io.IOException;
public class Sample
{
public static void main( String[] args )
{
StringReader stringReader = null;
NormalFilterReader normalFilterReader = null;
PushbackReader pushbackReader = null;
try
{
// 対象とする文字列。
String source = "あいうえお";
// その文字列を読み込み対象とする
// StringReaderクラス。
stringReader = new StringReader( source );
// このクラスを対象とするNormalFilterReaderクラスを用意します。
normalFilterReader = new NormalFilterReader( stringReader );
// このクラスを対象とするPushbackReaderクラスを用意します。
pushbackReader = new PushbackReader( normalFilterReader );
// つまり、
// StringReader
// ↓
// NormalFilterReader
// ↓
// PushbackReader
// という形で、文字入力ストリームクラスが連結したことになります。
while( true )
{
// 1文字取得します。
int i = pushbackReader.read();
if( i == -1 )
{
// -1が返されてきたら終わりです。
break;
}
// 出力します。
System.out.println( (char)i );
}
// NormalFilterReader#read() : あ ( 0x3042 )
// あ
// NormalFilterReader#read() : い ( 0x3044 )
// い
// NormalFilterReader#read() : う ( 0x3046 )
// う
// NormalFilterReader#read() : え ( 0x3048 )
// え
// NormalFilterReader#read() : お ( 0x304a )
// お
// NormalFilterReader#read() : ? ( 0xffffffff )
// このように、pushbackReaderのread()メソッドを呼ぶと、
// normalFilterReaderのread()メソッドを呼び出します。
// つまり文字入力ストリームが連結して「チェーン」になった
// というわけです。
}
catch( IOException e )
{
// 読み込みに失敗した際に、read()メソッドが
// IOException例外を投げます。
e.printStackTrace();
}
finally
{
// 処理が終わったら、最後にclose()メソッドを呼んで
// 後処理をします。また、これは必ず行うため、
// finally内で行います。
try
{
if( pushbackReader != null )
{
pushbackReader.close();
}
}
catch( IOException e )
{
// close()メソッドはIOExceptionがthrows指定されているので
// 一応受け取ります。
e.printStackTrace();
}
// 処理が終わったら、最後にclose()メソッドを呼んで
// 後処理をします。また、これは必ず行うため、
// finally内で行います。
try
{
if( normalFilterReader != null )
{
normalFilterReader.close();
}
}
catch( IOException e )
{
// close()メソッドはIOExceptionがthrows指定されているので
// 一応受け取ります。
e.printStackTrace();
}
// 処理が終わったら、最後にclose()メソッドを呼んで
// 後処理をします。また、これは必ず行うため、
// finally内で行います。
if( stringReader != null )
{
stringReader.close();
}
}
}
}
/**
* NormalFilterReaderクラス。
* FilterReaderクラスのサブクラスです。
*/
class NormalFilterReader extends FilterReader
{
/**
* コンストラクタ。
* 引数に「入力元」となる文字入力ストリームクラスを受け取ります。
* 「中継ぎ」に当たるので、Readerクラスを引数に受け取ります。
*/
public NormalFilterReader( Reader in )
{
// 処理はスーパークラスが受け持ってくれるので、
// スーパークラスに渡します。
super( in );
}
/**
* read()メソッド。
* このクラスを利用する文字入力ストリームクラスの
* read()メソッドから呼び出されます。
*/
public int read() throws IOException
{
// スーパークラスであるFilterReaderクラスの
// inフィールドに「入力元」のReaderクラスが
// 入っているので、そのread()メソッドを呼び出します。
int i = in.read();
System.out.println( "NormalFilterReader#read() : " + (char)i + " ( 0x" + Integer.toHexString( i ) + " )" );
return i;
}
}
import java.io.Reader;
import java.io.StringReader;
import java.io.PushbackReader;
import java.io.FilterReader;
import java.io.IOException;
public class Sample
{
public static void main( String[] args )
{
StringReader stringReader = null;
NormalFilterReader normalFilterReader = null;
PushbackReader pushbackReader = null;
try
{
// 対象とする文字列。
String source = "あいうえお";
// その文字列を読み込み対象とする
// StringReaderクラス。
stringReader = new StringReader( source );
// このクラスを対象とするNormalFilterReaderクラスを用意します。
normalFilterReader = new NormalFilterReader( stringReader );
// このクラスを対象とするPushbackReaderクラスを用意します。
pushbackReader = new PushbackReader( normalFilterReader );
// つまり、
// StringReader
// ↓
// NormalFilterReader
// ↓
// PushbackReader
// という形で、文字入力ストリームクラスが連結したことになります。
while( true )
{
// 1文字取得します。
int i = pushbackReader.read();
if( i == -1 )
{
// -1が返されてきたら終わりです。
break;
}
// 出力します。
System.out.println( (char)i );
}
// NormalFilterReader#read() : あ ( 0x3042 )
// あ
// NormalFilterReader#read() : い ( 0x3044 )
// い
// NormalFilterReader#read() : う ( 0x3046 )
// う
// NormalFilterReader#read() : え ( 0x3048 )
// え
// NormalFilterReader#read() : お ( 0x304a )
// お
// NormalFilterReader#read() : ? ( 0xffffffff )
// このように、pushbackReaderのread()メソッドを呼ぶと、
// normalFilterReaderのread()メソッドを呼び出します。
// つまり文字入力ストリームが連結して「チェーン」になった
// というわけです。
}
catch( IOException e )
{
// 読み込みに失敗した際に、read()メソッドが
// IOException例外を投げます。
e.printStackTrace();
}
finally
{
// 処理が終わったら、最後にclose()メソッドを呼んで
// 後処理をします。また、これは必ず行うため、
// finally内で行います。
try
{
if( pushbackReader != null )
{
pushbackReader.close();
}
}
catch( IOException e )
{
// close()メソッドはIOExceptionがthrows指定されているので
// 一応受け取ります。
e.printStackTrace();
}
// 処理が終わったら、最後にclose()メソッドを呼んで
// 後処理をします。また、これは必ず行うため、
// finally内で行います。
try
{
if( normalFilterReader != null )
{
normalFilterReader.close();
}
}
catch( IOException e )
{
// close()メソッドはIOExceptionがthrows指定されているので
// 一応受け取ります。
e.printStackTrace();
}
// 処理が終わったら、最後にclose()メソッドを呼んで
// 後処理をします。また、これは必ず行うため、
// finally内で行います。
if( stringReader != null )
{
stringReader.close();
}
}
}
}
/**
* NormalFilterReaderクラス。
* FilterReaderクラスのサブクラスです。
*/
class NormalFilterReader extends FilterReader
{
/**
* コンストラクタ。
* 引数に「入力元」となる文字入力ストリームクラスを受け取ります。
* 「中継ぎ」に当たるので、Readerクラスを引数に受け取ります。
*/
public NormalFilterReader( Reader in )
{
// 処理はスーパークラスが受け持ってくれるので、
// スーパークラスに渡します。
super( in );
}
/**
* read()メソッド。
* このクラスを利用する文字入力ストリームクラスの
* read()メソッドから呼び出されます。
*/
public int read() throws IOException
{
// スーパークラスであるFilterReaderクラスの
// inフィールドに「入力元」のReaderクラスが
// 入っているので、そのread()メソッドを呼び出します。
int i = in.read();
System.out.println( "NormalFilterReader#read() : " + (char)i + " ( 0x" + Integer.toHexString( i ) + " )" );
return i;
}
}
// Sample.java
import java.io.Reader;
import java.io.StringReader;
import java.io.PushbackReader;
import java.io.FilterReader;
import java.io.IOException;
public class Sample
{
public static void main( String[] args )
{
StringReader stringReader = null;
NormalFilterReader normalFilterReader = null;
PushbackReader pushbackReader = null;
try
{
// 対象とする文字列。
String source = "あいうえお";
// その文字列を読み込み対象とする
// StringReaderクラス。
stringReader = new StringReader( source );
// このクラスを対象とするNormalFilterReaderクラスを用意します。
normalFilterReader = new NormalFilterReader( stringReader );
// このクラスを対象とするPushbackReaderクラスを用意します。
pushbackReader = new PushbackReader( normalFilterReader );
// つまり、
// StringReader
// ↓
// NormalFilterReader
// ↓
// PushbackReader
// という形で、文字入力ストリームクラスが連結したことになります。
while( true )
{
// 1文字取得します。
int i = pushbackReader.read();
if( i == -1 )
{
// -1が返されてきたら終わりです。
break;
}
// 出力します。
System.out.println( (char)i );
}
// NormalFilterReader#read() : あ ( 0x3042 )
// あ
// NormalFilterReader#read() : い ( 0x3044 )
// い
// NormalFilterReader#read() : う ( 0x3046 )
// う
// NormalFilterReader#read() : え ( 0x3048 )
// え
// NormalFilterReader#read() : お ( 0x304a )
// お
// NormalFilterReader#read() : ? ( 0xffffffff )
// このように、pushbackReaderのread()メソッドを呼ぶと、
// normalFilterReaderのread()メソッドを呼び出します。
// つまり文字入力ストリームが連結して「チェーン」になった
// というわけです。
}
catch( IOException e )
{
// 読み込みに失敗した際に、read()メソッドが
// IOException例外を投げます。
e.printStackTrace();
}
finally
{
// 処理が終わったら、最後にclose()メソッドを呼んで
// 後処理をします。また、これは必ず行うため、
// finally内で行います。
try
{
if( pushbackReader != null )
{
pushbackReader.close();
}
}
catch( IOException e )
{
// close()メソッドはIOExceptionがthrows指定されているので
// 一応受け取ります。
e.printStackTrace();
}
// 処理が終わったら、最後にclose()メソッドを呼んで
// 後処理をします。また、これは必ず行うため、
// finally内で行います。
try
{
if( normalFilterReader != null )
{
normalFilterReader.close();
}
}
catch( IOException e )
{
// close()メソッドはIOExceptionがthrows指定されているので
// 一応受け取ります。
e.printStackTrace();
}
// 処理が終わったら、最後にclose()メソッドを呼んで
// 後処理をします。また、これは必ず行うため、
// finally内で行います。
if( stringReader != null )
{
stringReader.close();
}
}
}
}
/**
* NormalFilterReaderクラス。
* FilterReaderクラスのサブクラスです。
*/
class NormalFilterReader extends FilterReader
{
/**
* コンストラクタ。
* 引数に「入力元」となる文字入力ストリームクラスを受け取ります。
* 「中継ぎ」に当たるので、Readerクラスを引数に受け取ります。
*/
public NormalFilterReader( Reader in )
{
// 処理はスーパークラスが受け持ってくれるので、
// スーパークラスに渡します。
super( in );
}
/**
* read()メソッド。
* このクラスを利用する文字入力ストリームクラスの
* read()メソッドから呼び出されます。
*/
public int read() throws IOException
{
// スーパークラスであるFilterReaderクラスの
// inフィールドに「入力元」のReaderクラスが
// 入っているので、そのread()メソッドを呼び出します。
int i = in.read();
System.out.println( "NormalFilterReader#read() : " + (char)i + " ( 0x" + Integer.toHexString( i ) + " )" );
return i;
}
}




