FilterOutputStream
日本語 | 濾過膜出力流れ |
英語 | filter output stream |
ふりがな | ふぃるたーあうとぷっとすとりーむ |
フリガナ | フィルターアウトプットストリーム |
J2SEに含まれるクラスのひとつ。パッケージも含めたクラス名はjava.io.FilterOutputStream。
ストリームクラス。OutputStreamクラスのサブクラスであり、バイト出力ストリームクラスである。
バイト出力ストリームクラスの中では「中継ぎ」に位置する。
対になる入力側のクラスはDataInputStreamクラスである。
バイト出力ストリームの「中継ぎ」クラスのスーパークラス。
「出力用」→「中継ぎ」→「出力先」という連携の中で、「出力用」に渡したバイトデータを書き換えたりといった「中間位置での立ち回り」を行うクラスの、スーパークラスとなるクラスである。
そういったスーパークラスとしての役目だけ持つため、このクラスのみを単独で使用することはない。このクラスのサブクラスを使用するか、もしくはサブクラスを作成して使用する。
サブクラスにはBufferedOutputStreamクラス、DataOutputStreamクラス、PrintStreamクラス等のクラスがある。
FilterOutputStreamクラスのサブクラスを作成する場合、まずコンストラクタでOutputStreamクラスを引数に受け取り、FilterOutputStreamクラスのコンストラクタに渡す。そうすることで、FilterOutputStreamクラスのoutフィールドにこのOutputStreamクラスが格納される。このOutputStreamクラスは「出力先」に当たる。
その後、任意の(可能なら全ての)write()メソッドをオーバーロードする。基本的には、outフィールドのwrite()メソッドを呼び出して「出力先」へバイトデータを出力する。ただし、このサブクラスで行いたい機能によっては、バイトデータを加工してから出力する。
write()メソッドは、このサブクラスを他の「中継ぎ」クラスもしくは「出力用」クラスに渡した場合、そのwrite()メソッドから呼び出される。
つまり、「出力用」→「中継ぎ」→「出力先」の順でwrite()メソッドを呼び出していき、出力先のバイトストリームに出力する。
ストリームクラス。OutputStreamクラスのサブクラスであり、バイト出力ストリームクラスである。
バイト出力ストリームクラスの中では「中継ぎ」に位置する。
対になる入力側のクラスはDataInputStreamクラスである。
バイト出力ストリームの「中継ぎ」クラスのスーパークラス。
「出力用」→「中継ぎ」→「出力先」という連携の中で、「出力用」に渡したバイトデータを書き換えたりといった「中間位置での立ち回り」を行うクラスの、スーパークラスとなるクラスである。
そういったスーパークラスとしての役目だけ持つため、このクラスのみを単独で使用することはない。このクラスのサブクラスを使用するか、もしくはサブクラスを作成して使用する。
サブクラスにはBufferedOutputStreamクラス、DataOutputStreamクラス、PrintStreamクラス等のクラスがある。
FilterOutputStreamクラスのサブクラスを作成する場合、まずコンストラクタでOutputStreamクラスを引数に受け取り、FilterOutputStreamクラスのコンストラクタに渡す。そうすることで、FilterOutputStreamクラスのoutフィールドにこのOutputStreamクラスが格納される。このOutputStreamクラスは「出力先」に当たる。
その後、任意の(可能なら全ての)write()メソッドをオーバーロードする。基本的には、outフィールドのwrite()メソッドを呼び出して「出力先」へバイトデータを出力する。ただし、このサブクラスで行いたい機能によっては、バイトデータを加工してから出力する。
write()メソッドは、このサブクラスを他の「中継ぎ」クラスもしくは「出力用」クラスに渡した場合、そのwrite()メソッドから呼び出される。
つまり、「出力用」→「中継ぎ」→「出力先」の順でwrite()メソッドを呼び出していき、出力先のバイトストリームに出力する。
参考サイト
// Sample.java
import java.io.OutputStream;
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import java.io.FilterOutputStream;
import java.io.IOException;
public class Sample
{
public static void main( String[] args )
{
ByteArrayOutputStream byteArrayOutputStream = null;
NormalFilterOutputStream normalFilterOutputStream = null;
PrintStream printStream = null;
try
{
// 「出力先」のByteArrayInputStreamクラスを用意します。
byteArrayOutputStream = new ByteArrayOutputStream();
// このクラスを対象とするNormalFilterOutputStreamクラスを用意します。
normalFilterOutputStream = new NormalFilterOutputStream( byteArrayOutputStream );
// このクラスを対象とするPrintStreamクラスを用意します。
printStream = new PrintStream( normalFilterOutputStream );
// つまり、
// PrintStream
// ↓
// NormalFilterOutputStream
// ↓
// ByteArrayOutputStream
// という形で、バイト出力ストリームクラスが連結したことになります。
// 出力します。
printStream.write( 1 );
printStream.write( 2 );
printStream.write( 3 );
// NormalFilterOutputStream#write() : 1
// NormalFilterOutputStream#write() : 2
// NormalFilterOutputStream#write() : 3
// 書き込まれたバイトデータをbyte型配列として取得します。
byte[] bytes = byteArrayOutputStream.toByteArray();
for( int iF1 = 0; iF1 < bytes.length; ++iF1 )
{
// 出力します。
System.out.println( "0x" + Integer.toHexString( bytes[iF1] ) + " ( " + bytes[iF1] + " )" );
}
// 0x1 ( 1 )
// 0x2 ( 2 )
// 0x3 ( 3 )
// このように、printStreamのwrite()メソッドを呼ぶと、
// normalFilterOutputStreamのwrite()メソッドを呼び出し、さらに
// byteArrayOutputStreamのwrite()メソッドを呼び出します。
// つまりバイト出力ストリームが連結して「チェーン」になった
// というわけです。
}
finally
{
// 処理が終わったら、最後にclose()メソッドを呼んで
// 後処理をします。また、これは必ず行うため、
// finally内で行います。
if( printStream != null )
{
printStream.close();
}
// 処理が終わったら、最後にclose()メソッドを呼んで
// 後処理をします。また、これは必ず行うため、
// finally内で行います。
try
{
if( normalFilterOutputStream != null )
{
normalFilterOutputStream.close();
}
}
catch( IOException e )
{
// close()メソッドはIOExceptionがthrows指定されているので
// 一応受け取ります。
e.printStackTrace();
}
// 処理が終わったら、最後にclose()メソッドを呼んで
// 後処理をします。また、これは必ず行うため、
// finally内で行います。
try
{
if( byteArrayOutputStream != null )
{
byteArrayOutputStream.close();
}
}
catch( IOException e )
{
// close()メソッドはIOExceptionがthrows指定されているので
// 一応受け取ります。
e.printStackTrace();
}
}
}
}
/**
* NormalFilterOutputStreamクラス。
* FilterOutputStreamクラスのサブクラスです。
*/
class NormalFilterOutputStream extends FilterOutputStream
{
/**
* コンストラクタ。
* 引数に「出力先」となるバイト出力ストリームクラスを受け取ります。
* 「中継ぎ」に当たるので、OutputStreamクラスを引数に受け取ります。
*/
public NormalFilterOutputStream( OutputStream out )
{
// 処理はスーパークラスが受け持ってくれるので、
// スーパークラスに渡します。
super( out );
}
/**
* write()メソッド。
* このクラスを利用するバイト出力ストリームクラスの
* write()メソッドから呼び出されます。
*/
public void write( int b ) throws IOException
{
// スーパークラスであるFilterOutputStreamクラスの
// outフィールドに「出力先」のOutputStreamクラスが
// 入っているので、そのwrite()メソッドを呼び出します。
out.write( b );
System.out.println( "NormalFilterOutputStream#write() : " + b );
}
}
import java.io.OutputStream;
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import java.io.FilterOutputStream;
import java.io.IOException;
public class Sample
{
public static void main( String[] args )
{
ByteArrayOutputStream byteArrayOutputStream = null;
NormalFilterOutputStream normalFilterOutputStream = null;
PrintStream printStream = null;
try
{
// 「出力先」のByteArrayInputStreamクラスを用意します。
byteArrayOutputStream = new ByteArrayOutputStream();
// このクラスを対象とするNormalFilterOutputStreamクラスを用意します。
normalFilterOutputStream = new NormalFilterOutputStream( byteArrayOutputStream );
// このクラスを対象とするPrintStreamクラスを用意します。
printStream = new PrintStream( normalFilterOutputStream );
// つまり、
// PrintStream
// ↓
// NormalFilterOutputStream
// ↓
// ByteArrayOutputStream
// という形で、バイト出力ストリームクラスが連結したことになります。
// 出力します。
printStream.write( 1 );
printStream.write( 2 );
printStream.write( 3 );
// NormalFilterOutputStream#write() : 1
// NormalFilterOutputStream#write() : 2
// NormalFilterOutputStream#write() : 3
// 書き込まれたバイトデータをbyte型配列として取得します。
byte[] bytes = byteArrayOutputStream.toByteArray();
for( int iF1 = 0; iF1 < bytes.length; ++iF1 )
{
// 出力します。
System.out.println( "0x" + Integer.toHexString( bytes[iF1] ) + " ( " + bytes[iF1] + " )" );
}
// 0x1 ( 1 )
// 0x2 ( 2 )
// 0x3 ( 3 )
// このように、printStreamのwrite()メソッドを呼ぶと、
// normalFilterOutputStreamのwrite()メソッドを呼び出し、さらに
// byteArrayOutputStreamのwrite()メソッドを呼び出します。
// つまりバイト出力ストリームが連結して「チェーン」になった
// というわけです。
}
finally
{
// 処理が終わったら、最後にclose()メソッドを呼んで
// 後処理をします。また、これは必ず行うため、
// finally内で行います。
if( printStream != null )
{
printStream.close();
}
// 処理が終わったら、最後にclose()メソッドを呼んで
// 後処理をします。また、これは必ず行うため、
// finally内で行います。
try
{
if( normalFilterOutputStream != null )
{
normalFilterOutputStream.close();
}
}
catch( IOException e )
{
// close()メソッドはIOExceptionがthrows指定されているので
// 一応受け取ります。
e.printStackTrace();
}
// 処理が終わったら、最後にclose()メソッドを呼んで
// 後処理をします。また、これは必ず行うため、
// finally内で行います。
try
{
if( byteArrayOutputStream != null )
{
byteArrayOutputStream.close();
}
}
catch( IOException e )
{
// close()メソッドはIOExceptionがthrows指定されているので
// 一応受け取ります。
e.printStackTrace();
}
}
}
}
/**
* NormalFilterOutputStreamクラス。
* FilterOutputStreamクラスのサブクラスです。
*/
class NormalFilterOutputStream extends FilterOutputStream
{
/**
* コンストラクタ。
* 引数に「出力先」となるバイト出力ストリームクラスを受け取ります。
* 「中継ぎ」に当たるので、OutputStreamクラスを引数に受け取ります。
*/
public NormalFilterOutputStream( OutputStream out )
{
// 処理はスーパークラスが受け持ってくれるので、
// スーパークラスに渡します。
super( out );
}
/**
* write()メソッド。
* このクラスを利用するバイト出力ストリームクラスの
* write()メソッドから呼び出されます。
*/
public void write( int b ) throws IOException
{
// スーパークラスであるFilterOutputStreamクラスの
// outフィールドに「出力先」のOutputStreamクラスが
// 入っているので、そのwrite()メソッドを呼び出します。
out.write( b );
System.out.println( "NormalFilterOutputStream#write() : " + b );
}
}
// Sample.java import java.io.OutputStream; import java.io.ByteArrayOutputStream; import java.io.PrintStream; import java.io.FilterOutputStream; import java.io.IOException; public class Sample { public static void main( String[] args ) { ByteArrayOutputStream byteArrayOutputStream = null; NormalFilterOutputStream normalFilterOutputStream = null; PrintStream printStream = null; try { // 「出力先」のByteArrayInputStreamクラスを用意します。 byteArrayOutputStream = new ByteArrayOutputStream(); // このクラスを対象とするNormalFilterOutputStreamクラスを用意します。 normalFilterOutputStream = new NormalFilterOutputStream( byteArrayOutputStream ); // このクラスを対象とするPrintStreamクラスを用意します。 printStream = new PrintStream( normalFilterOutputStream ); // つまり、 // PrintStream // ↓ // NormalFilterOutputStream // ↓ // ByteArrayOutputStream // という形で、バイト出力ストリームクラスが連結したことになります。 // 出力します。 printStream.write( 1 ); printStream.write( 2 ); printStream.write( 3 ); // NormalFilterOutputStream#write() : 1 // NormalFilterOutputStream#write() : 2 // NormalFilterOutputStream#write() : 3 // 書き込まれたバイトデータをbyte型配列として取得します。 byte[] bytes = byteArrayOutputStream.toByteArray(); for( int iF1 = 0; iF1 < bytes.length; ++iF1 ) { // 出力します。 System.out.println( "0x" + Integer.toHexString( bytes[iF1] ) + " ( " + bytes[iF1] + " )" ); } // 0x1 ( 1 ) // 0x2 ( 2 ) // 0x3 ( 3 ) // このように、printStreamのwrite()メソッドを呼ぶと、 // normalFilterOutputStreamのwrite()メソッドを呼び出し、さらに // byteArrayOutputStreamのwrite()メソッドを呼び出します。 // つまりバイト出力ストリームが連結して「チェーン」になった // というわけです。 } finally { // 処理が終わったら、最後にclose()メソッドを呼んで // 後処理をします。また、これは必ず行うため、 // finally内で行います。 if( printStream != null ) { printStream.close(); } // 処理が終わったら、最後にclose()メソッドを呼んで // 後処理をします。また、これは必ず行うため、 // finally内で行います。 try { if( normalFilterOutputStream != null ) { normalFilterOutputStream.close(); } } catch( IOException e ) { // close()メソッドはIOExceptionがthrows指定されているので // 一応受け取ります。 e.printStackTrace(); } // 処理が終わったら、最後にclose()メソッドを呼んで // 後処理をします。また、これは必ず行うため、 // finally内で行います。 try { if( byteArrayOutputStream != null ) { byteArrayOutputStream.close(); } } catch( IOException e ) { // close()メソッドはIOExceptionがthrows指定されているので // 一応受け取ります。 e.printStackTrace(); } } } } /** * NormalFilterOutputStreamクラス。 * FilterOutputStreamクラスのサブクラスです。 */ class NormalFilterOutputStream extends FilterOutputStream { /** * コンストラクタ。 * 引数に「出力先」となるバイト出力ストリームクラスを受け取ります。 * 「中継ぎ」に当たるので、OutputStreamクラスを引数に受け取ります。 */ public NormalFilterOutputStream( OutputStream out ) { // 処理はスーパークラスが受け持ってくれるので、 // スーパークラスに渡します。 super( out ); } /** * write()メソッド。 * このクラスを利用するバイト出力ストリームクラスの * write()メソッドから呼び出されます。 */ public void write( int b ) throws IOException { // スーパークラスであるFilterOutputStreamクラスの // outフィールドに「出力先」のOutputStreamクラスが // 入っているので、そのwrite()メソッドを呼び出します。 out.write( b ); System.out.println( "NormalFilterOutputStream#write() : " + b ); } }