FilterInputStream
日本語 | 濾過膜入力流れ |
英語 | filter input stream |
ふりがな | ふぃるたーいんぷっとすとりーむ |
フリガナ | フィルターインプットストリーム |
J2SEに含まれるクラスのひとつ。パッケージも含めたクラス名はjava.io.FilterInputStream。
ストリームクラス。InputStreamクラスのサブクラスであり、バイト入力ストリームクラスである。
バイト入力ストリームクラスの中では「中継ぎ」に位置する。
対になる出力側のクラスはFilterOutputStreamクラスである。
バイト入力ストリームの「中継ぎ」クラスのスーパークラス。
「入力元」→「中継ぎ」→「取得用」という連携の中で、「入力元」から取得したバイトデータを書き換えたり、「取得用」からの取得指示に対して特殊な方法で取得する、といった「中間位置での立ち回り」を行うクラスの、スーパークラスとなるクラスである。
そういったスーパークラスとしての役目だけ持つため、このクラスのみを単独で使用することはない。このクラスのサブクラスを使用するか、もしくはサブクラスを作成して使用する。
サブクラスにはBufferedInputStreamクラス、DataInputStreamクラス、PushbackInputStreamクラス等のクラスがある。
FilterInputStreamクラスのサブクラスを作成する場合、まずコンストラクタでInputStreamクラスを引数に受け取り、FilterInputStreamクラスのコンストラクタに渡す。そうすることで、FilterInputStreamクラスのinフィールドにこのInputStreamクラスが格納される。このInputStreamクラスは「入力元」に当たる。
その後、任意の(可能なら全ての)read()メソッドをオーバーロードする。基本的には、inフィールドのread()メソッドを呼び出して「入力元」からバイトストリームを取得し、そのまま返す。ただし、このサブクラスで行いたい機能によっては、この取得したバイトストリームを加工したり、別のバイトストリームから値を返すようにする。。
read()メソッドは、このサブクラスを他の「中継ぎ」クラスもしくは「取得用」クラスに渡した場合、そのread()メソッドから呼び出される。
つまり、「取得用」→「中継ぎ」→「入力元」の順でread()メソッドを呼び出していき、その逆方向に値を返していく。
ストリームクラス。InputStreamクラスのサブクラスであり、バイト入力ストリームクラスである。
バイト入力ストリームクラスの中では「中継ぎ」に位置する。
対になる出力側のクラスはFilterOutputStreamクラスである。
バイト入力ストリームの「中継ぎ」クラスのスーパークラス。
「入力元」→「中継ぎ」→「取得用」という連携の中で、「入力元」から取得したバイトデータを書き換えたり、「取得用」からの取得指示に対して特殊な方法で取得する、といった「中間位置での立ち回り」を行うクラスの、スーパークラスとなるクラスである。
そういったスーパークラスとしての役目だけ持つため、このクラスのみを単独で使用することはない。このクラスのサブクラスを使用するか、もしくはサブクラスを作成して使用する。
サブクラスにはBufferedInputStreamクラス、DataInputStreamクラス、PushbackInputStreamクラス等のクラスがある。
FilterInputStreamクラスのサブクラスを作成する場合、まずコンストラクタでInputStreamクラスを引数に受け取り、FilterInputStreamクラスのコンストラクタに渡す。そうすることで、FilterInputStreamクラスのinフィールドにこのInputStreamクラスが格納される。このInputStreamクラスは「入力元」に当たる。
その後、任意の(可能なら全ての)read()メソッドをオーバーロードする。基本的には、inフィールドのread()メソッドを呼び出して「入力元」からバイトストリームを取得し、そのまま返す。ただし、このサブクラスで行いたい機能によっては、この取得したバイトストリームを加工したり、別のバイトストリームから値を返すようにする。。
read()メソッドは、このサブクラスを他の「中継ぎ」クラスもしくは「取得用」クラスに渡した場合、そのread()メソッドから呼び出される。
つまり、「取得用」→「中継ぎ」→「入力元」の順でread()メソッドを呼び出していき、その逆方向に値を返していく。
参考サイト
// Sample.java
import java.io.InputStream;
import java.io.ByteArrayInputStream;
import java.io.PushbackInputStream;
import java.io.FilterInputStream;
import java.io.IOException;
public class Sample
{
public static void main( String[] args )
{
ByteArrayInputStream byteArrayInputStream = null;
NormalFilterInputStream normalFilterInputStream = null;
PushbackInputStream pushbackInputStream = null;
try
{
// 処理対象のバイト配列1。
byte[] bytes = new byte[]{ 1, 2, 3 };
// そのバイト配列を読み込み対象とする
// ByteArrayInputStreamクラス。
byteArrayInputStream = new ByteArrayInputStream( bytes );
// このクラスを対象とするNormalFilterInputStreamクラスを用意します。
normalFilterInputStream = new NormalFilterInputStream( byteArrayInputStream );
// このクラスを対象とするPushbackInputStreamクラスを用意します。
pushbackInputStream = new PushbackInputStream( normalFilterInputStream );
// つまり、
// ByteArrayInputStream
// ↓
// NormalFilterInputStream
// ↓
// PushbackInputStream
// という形で、バイト入力ストリームクラスが連結したことになります。
while( true )
{
// 1バイト取得します。
int i = pushbackInputStream.read();
if( i == -1 )
{
// -1が返されてきたら終わりです。
break;
}
// 出力します。
System.out.println( "0x" + Integer.toHexString( i ) + " ( " + i + " )" );
}
// NormalFilterInputStream#read() : 1
// 0x1 ( 1 )
// NormalFilterInputStream#read() : 2
// 0x2 ( 2 )
// NormalFilterInputStream#read() : 3
// 0x3 ( 3 )
// NormalFilterInputStream#read() : -1
// このように、pushbackInputStreamのread()メソッドを呼ぶと、
// normalFilterInputStreamの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( normalFilterInputStream != null )
{
normalFilterInputStream.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();
}
}
}
}
/**
* NormalFilterInputStreamクラス。
* FilterInputStreamクラスのサブクラスです。
*/
class NormalFilterInputStream extends FilterInputStream
{
/**
* コンストラクタ。
* 引数に「入力元」となるバイト入力ストリームクラスを受け取ります。
* 「中継ぎ」に当たるので、InputStreamクラスを引数に受け取ります。
*/
public NormalFilterInputStream( InputStream in )
{
// 処理はスーパークラスが受け持ってくれるので、
// スーパークラスに渡します。
super( in );
}
/**
* read()メソッド。
* このクラスを利用するバイト入力ストリームクラスの
* read()メソッドから呼び出されます。
*/
public int read() throws IOException
{
// スーパークラスであるFilterInputStreamクラスの
// inフィールドに「入力元」のInputStreamクラスが
// 入っているので、そのread()メソッドを呼び出します。
int i = in.read();
System.out.println( "NormalFilterInputStream#read() : " + i );
return i;
}
}
import java.io.InputStream;
import java.io.ByteArrayInputStream;
import java.io.PushbackInputStream;
import java.io.FilterInputStream;
import java.io.IOException;
public class Sample
{
public static void main( String[] args )
{
ByteArrayInputStream byteArrayInputStream = null;
NormalFilterInputStream normalFilterInputStream = null;
PushbackInputStream pushbackInputStream = null;
try
{
// 処理対象のバイト配列1。
byte[] bytes = new byte[]{ 1, 2, 3 };
// そのバイト配列を読み込み対象とする
// ByteArrayInputStreamクラス。
byteArrayInputStream = new ByteArrayInputStream( bytes );
// このクラスを対象とするNormalFilterInputStreamクラスを用意します。
normalFilterInputStream = new NormalFilterInputStream( byteArrayInputStream );
// このクラスを対象とするPushbackInputStreamクラスを用意します。
pushbackInputStream = new PushbackInputStream( normalFilterInputStream );
// つまり、
// ByteArrayInputStream
// ↓
// NormalFilterInputStream
// ↓
// PushbackInputStream
// という形で、バイト入力ストリームクラスが連結したことになります。
while( true )
{
// 1バイト取得します。
int i = pushbackInputStream.read();
if( i == -1 )
{
// -1が返されてきたら終わりです。
break;
}
// 出力します。
System.out.println( "0x" + Integer.toHexString( i ) + " ( " + i + " )" );
}
// NormalFilterInputStream#read() : 1
// 0x1 ( 1 )
// NormalFilterInputStream#read() : 2
// 0x2 ( 2 )
// NormalFilterInputStream#read() : 3
// 0x3 ( 3 )
// NormalFilterInputStream#read() : -1
// このように、pushbackInputStreamのread()メソッドを呼ぶと、
// normalFilterInputStreamの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( normalFilterInputStream != null )
{
normalFilterInputStream.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();
}
}
}
}
/**
* NormalFilterInputStreamクラス。
* FilterInputStreamクラスのサブクラスです。
*/
class NormalFilterInputStream extends FilterInputStream
{
/**
* コンストラクタ。
* 引数に「入力元」となるバイト入力ストリームクラスを受け取ります。
* 「中継ぎ」に当たるので、InputStreamクラスを引数に受け取ります。
*/
public NormalFilterInputStream( InputStream in )
{
// 処理はスーパークラスが受け持ってくれるので、
// スーパークラスに渡します。
super( in );
}
/**
* read()メソッド。
* このクラスを利用するバイト入力ストリームクラスの
* read()メソッドから呼び出されます。
*/
public int read() throws IOException
{
// スーパークラスであるFilterInputStreamクラスの
// inフィールドに「入力元」のInputStreamクラスが
// 入っているので、そのread()メソッドを呼び出します。
int i = in.read();
System.out.println( "NormalFilterInputStream#read() : " + i );
return i;
}
}
// Sample.java import java.io.InputStream; import java.io.ByteArrayInputStream; import java.io.PushbackInputStream; import java.io.FilterInputStream; import java.io.IOException; public class Sample { public static void main( String[] args ) { ByteArrayInputStream byteArrayInputStream = null; NormalFilterInputStream normalFilterInputStream = null; PushbackInputStream pushbackInputStream = null; try { // 処理対象のバイト配列1。 byte[] bytes = new byte[]{ 1, 2, 3 }; // そのバイト配列を読み込み対象とする // ByteArrayInputStreamクラス。 byteArrayInputStream = new ByteArrayInputStream( bytes ); // このクラスを対象とするNormalFilterInputStreamクラスを用意します。 normalFilterInputStream = new NormalFilterInputStream( byteArrayInputStream ); // このクラスを対象とするPushbackInputStreamクラスを用意します。 pushbackInputStream = new PushbackInputStream( normalFilterInputStream ); // つまり、 // ByteArrayInputStream // ↓ // NormalFilterInputStream // ↓ // PushbackInputStream // という形で、バイト入力ストリームクラスが連結したことになります。 while( true ) { // 1バイト取得します。 int i = pushbackInputStream.read(); if( i == -1 ) { // -1が返されてきたら終わりです。 break; } // 出力します。 System.out.println( "0x" + Integer.toHexString( i ) + " ( " + i + " )" ); } // NormalFilterInputStream#read() : 1 // 0x1 ( 1 ) // NormalFilterInputStream#read() : 2 // 0x2 ( 2 ) // NormalFilterInputStream#read() : 3 // 0x3 ( 3 ) // NormalFilterInputStream#read() : -1 // このように、pushbackInputStreamのread()メソッドを呼ぶと、 // normalFilterInputStreamの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( normalFilterInputStream != null ) { normalFilterInputStream.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(); } } } } /** * NormalFilterInputStreamクラス。 * FilterInputStreamクラスのサブクラスです。 */ class NormalFilterInputStream extends FilterInputStream { /** * コンストラクタ。 * 引数に「入力元」となるバイト入力ストリームクラスを受け取ります。 * 「中継ぎ」に当たるので、InputStreamクラスを引数に受け取ります。 */ public NormalFilterInputStream( InputStream in ) { // 処理はスーパークラスが受け持ってくれるので、 // スーパークラスに渡します。 super( in ); } /** * read()メソッド。 * このクラスを利用するバイト入力ストリームクラスの * read()メソッドから呼び出されます。 */ public int read() throws IOException { // スーパークラスであるFilterInputStreamクラスの // inフィールドに「入力元」のInputStreamクラスが // 入っているので、そのread()メソッドを呼び出します。 int i = in.read(); System.out.println( "NormalFilterInputStream#read() : " + i ); return i; } }