FilterWriter
日本語 | 濾過膜書記 |
英語 | filter writer |
ふりがな | ふぃるたーらいたー |
フリガナ | フィルターライター |
J2SEに含まれるクラスのひとつ。パッケージも含めたクラス名はjava.io.FilterWriter。
ストリームクラス。Writerクラスのサブクラスであり、文字出力ストリームクラスである。
文字出力ストリームクラスの中では「出力用」に位置する。
対になる入力側のクラスはFilterReaderクラスである。
文字出力ストリームの「中継ぎ」クラスのスーパークラス。
「出力用」→「中継ぎ」→「出力先」という連携の中で、「出力用」に渡した文字データを書き換えたりといった「中間位置での立ち回り」を行うクラスの、スーパークラスとなるクラスである。
そういったスーパークラスとしての役目だけ持つため、このクラスのみを単独で使用することはない。このクラスのサブクラスを使用するか、もしくはサブクラスを作成して使用する。
ただし、J2SEにはFilterWriterクラスのサブクラスは存在しない。使用する場合には、自らサブクラスを作成することになる。
これは、バイト出力ストリームに比べ、文字出力ストリームは「文字列」というフォーマットが決められているため、中継ぎでの「加工」を行いにくいためである。
FilterWriterクラスのサブクラスを作成する場合、まずコンストラクタでWriterクラスを引数に受け取り、FilterWriterクラスのコンストラクタに渡す。そうすることで、FilterWriterクラスのoutフィールドにこのWriterクラスが格納される。このWriterクラスは「出力先」に当たる。
その後、任意の(可能なら全ての)write()メソッドをオーバーロードする。基本的には、outフィールドのwrite()メソッドを呼び出して「出力先」へ文字データを出力する。ただし、このサブクラスで行いたい機能によっては、文字データを加工してから出力する。
write()メソッドは、このサブクラスを他の「中継ぎ」クラスもしくは「出力用」クラスに渡した場合、そのwrite()メソッドから呼び出される。
つまり、「出力用」→「中継ぎ」→「出力先」の順でwrite()メソッドを呼び出していき、出力先の文字ストリームに出力する。
ストリームクラス。Writerクラスのサブクラスであり、文字出力ストリームクラスである。
文字出力ストリームクラスの中では「出力用」に位置する。
対になる入力側のクラスはFilterReaderクラスである。
文字出力ストリームの「中継ぎ」クラスのスーパークラス。
「出力用」→「中継ぎ」→「出力先」という連携の中で、「出力用」に渡した文字データを書き換えたりといった「中間位置での立ち回り」を行うクラスの、スーパークラスとなるクラスである。
そういったスーパークラスとしての役目だけ持つため、このクラスのみを単独で使用することはない。このクラスのサブクラスを使用するか、もしくはサブクラスを作成して使用する。
ただし、J2SEにはFilterWriterクラスのサブクラスは存在しない。使用する場合には、自らサブクラスを作成することになる。
これは、バイト出力ストリームに比べ、文字出力ストリームは「文字列」というフォーマットが決められているため、中継ぎでの「加工」を行いにくいためである。
FilterWriterクラスのサブクラスを作成する場合、まずコンストラクタでWriterクラスを引数に受け取り、FilterWriterクラスのコンストラクタに渡す。そうすることで、FilterWriterクラスのoutフィールドにこのWriterクラスが格納される。このWriterクラスは「出力先」に当たる。
その後、任意の(可能なら全ての)write()メソッドをオーバーロードする。基本的には、outフィールドのwrite()メソッドを呼び出して「出力先」へ文字データを出力する。ただし、このサブクラスで行いたい機能によっては、文字データを加工してから出力する。
write()メソッドは、このサブクラスを他の「中継ぎ」クラスもしくは「出力用」クラスに渡した場合、そのwrite()メソッドから呼び出される。
つまり、「出力用」→「中継ぎ」→「出力先」の順でwrite()メソッドを呼び出していき、出力先の文字ストリームに出力する。
参考サイト
// Sample.java
import java.io.Writer;
import java.io.CharArrayWriter;
import java.io.PrintWriter;
import java.io.FilterWriter;
import java.io.IOException;
public class Sample
{
public static void main( String[] args )
{
CharArrayWriter charArrayWriter = null;
NormalFilterWriter normalFilterWriter = null;
PrintWriter printWriter = null;
try
{
// 「出力先」のCharArrayWriterクラスを用意します。
charArrayWriter = new CharArrayWriter();
// このクラスを対象とするNormalFilterWriterクラスを用意します。
normalFilterWriter = new NormalFilterWriter( charArrayWriter );
// このクラスを対象とするPrintWriterクラスを用意します。
printWriter = new PrintWriter( normalFilterWriter );
// つまり、
// PrintWriter
// ↓
// NormalFilterWriter
// ↓
// CharArrayWriter
// という形で、文字出力ストリームクラスが連結したことになります。
// 出力します。
printWriter.write( 'あ' );
printWriter.write( 'い' );
printWriter.write( 'う' );
// NormalFilterWriter#write() : あ
// NormalFilterWriter#write() : い
// NormalFilterWriter#write() : う
// 1文字単位で出力します。
char[] chars = charArrayWriter.toCharArray();
for( int iF1 = 0; iF1 < chars.length; ++iF1 )
{
// 出力します。
System.out.println( chars[iF1] );
}
// あ
// い
// う
// このように、printWriterのwrite()メソッドを呼ぶと、
// normalFilterWriterのwrite()メソッドを呼び出し、さらに
// charArrayWriterのwrite()メソッドを呼び出します。
// つまり文字出力ストリームが連結して「チェーン」になった
// というわけです。
}
finally
{
// 処理が終わったら、最後にclose()メソッドを呼んで
// 後処理をします。また、これは必ず行うため、
// finally内で行います。
if( printWriter != null )
{
printWriter.close();
}
// 処理が終わったら、最後にclose()メソッドを呼んで
// 後処理をします。また、これは必ず行うため、
// finally内で行います。
try
{
if( normalFilterWriter != null )
{
normalFilterWriter.close();
}
}
catch( IOException e )
{
// close()メソッドはIOExceptionがthrows指定されているので
// 一応受け取ります。
e.printStackTrace();
}
// 処理が終わったら、最後にclose()メソッドを呼んで
// 後処理をします。また、これは必ず行うため、
// finally内で行います。
if( charArrayWriter != null )
{
charArrayWriter.close();
}
}
}
}
/**
* NormalFilterWriterクラス。
* FilterWriterクラスのサブクラスです。
*/
class NormalFilterWriter extends FilterWriter
{
/**
* コンストラクタ。
* 引数に「出力先」となる文字出力ストリームクラスを受け取ります。
* 「中継ぎ」に当たるので、Writerクラスを引数に受け取ります。
*/
public NormalFilterWriter( Writer out )
{
// 処理はスーパークラスが受け持ってくれるので、
// スーパークラスに渡します。
super( out );
}
/**
* write()メソッド。
* このクラスを利用する文字出力ストリームクラスの
* write()メソッドから呼び出されます。
*/
public void write( int c ) throws IOException
{
// スーパークラスであるFilterWriterクラスの
// outフィールドに「出力先」のWriterクラスが
// 入っているので、そのwrite()メソッドを呼び出します。
out.write( c );
System.out.println( "NormalFilterWriter#write() : " + (char)c );
}
}
import java.io.Writer;
import java.io.CharArrayWriter;
import java.io.PrintWriter;
import java.io.FilterWriter;
import java.io.IOException;
public class Sample
{
public static void main( String[] args )
{
CharArrayWriter charArrayWriter = null;
NormalFilterWriter normalFilterWriter = null;
PrintWriter printWriter = null;
try
{
// 「出力先」のCharArrayWriterクラスを用意します。
charArrayWriter = new CharArrayWriter();
// このクラスを対象とするNormalFilterWriterクラスを用意します。
normalFilterWriter = new NormalFilterWriter( charArrayWriter );
// このクラスを対象とするPrintWriterクラスを用意します。
printWriter = new PrintWriter( normalFilterWriter );
// つまり、
// PrintWriter
// ↓
// NormalFilterWriter
// ↓
// CharArrayWriter
// という形で、文字出力ストリームクラスが連結したことになります。
// 出力します。
printWriter.write( 'あ' );
printWriter.write( 'い' );
printWriter.write( 'う' );
// NormalFilterWriter#write() : あ
// NormalFilterWriter#write() : い
// NormalFilterWriter#write() : う
// 1文字単位で出力します。
char[] chars = charArrayWriter.toCharArray();
for( int iF1 = 0; iF1 < chars.length; ++iF1 )
{
// 出力します。
System.out.println( chars[iF1] );
}
// あ
// い
// う
// このように、printWriterのwrite()メソッドを呼ぶと、
// normalFilterWriterのwrite()メソッドを呼び出し、さらに
// charArrayWriterのwrite()メソッドを呼び出します。
// つまり文字出力ストリームが連結して「チェーン」になった
// というわけです。
}
finally
{
// 処理が終わったら、最後にclose()メソッドを呼んで
// 後処理をします。また、これは必ず行うため、
// finally内で行います。
if( printWriter != null )
{
printWriter.close();
}
// 処理が終わったら、最後にclose()メソッドを呼んで
// 後処理をします。また、これは必ず行うため、
// finally内で行います。
try
{
if( normalFilterWriter != null )
{
normalFilterWriter.close();
}
}
catch( IOException e )
{
// close()メソッドはIOExceptionがthrows指定されているので
// 一応受け取ります。
e.printStackTrace();
}
// 処理が終わったら、最後にclose()メソッドを呼んで
// 後処理をします。また、これは必ず行うため、
// finally内で行います。
if( charArrayWriter != null )
{
charArrayWriter.close();
}
}
}
}
/**
* NormalFilterWriterクラス。
* FilterWriterクラスのサブクラスです。
*/
class NormalFilterWriter extends FilterWriter
{
/**
* コンストラクタ。
* 引数に「出力先」となる文字出力ストリームクラスを受け取ります。
* 「中継ぎ」に当たるので、Writerクラスを引数に受け取ります。
*/
public NormalFilterWriter( Writer out )
{
// 処理はスーパークラスが受け持ってくれるので、
// スーパークラスに渡します。
super( out );
}
/**
* write()メソッド。
* このクラスを利用する文字出力ストリームクラスの
* write()メソッドから呼び出されます。
*/
public void write( int c ) throws IOException
{
// スーパークラスであるFilterWriterクラスの
// outフィールドに「出力先」のWriterクラスが
// 入っているので、そのwrite()メソッドを呼び出します。
out.write( c );
System.out.println( "NormalFilterWriter#write() : " + (char)c );
}
}
// Sample.java import java.io.Writer; import java.io.CharArrayWriter; import java.io.PrintWriter; import java.io.FilterWriter; import java.io.IOException; public class Sample { public static void main( String[] args ) { CharArrayWriter charArrayWriter = null; NormalFilterWriter normalFilterWriter = null; PrintWriter printWriter = null; try { // 「出力先」のCharArrayWriterクラスを用意します。 charArrayWriter = new CharArrayWriter(); // このクラスを対象とするNormalFilterWriterクラスを用意します。 normalFilterWriter = new NormalFilterWriter( charArrayWriter ); // このクラスを対象とするPrintWriterクラスを用意します。 printWriter = new PrintWriter( normalFilterWriter ); // つまり、 // PrintWriter // ↓ // NormalFilterWriter // ↓ // CharArrayWriter // という形で、文字出力ストリームクラスが連結したことになります。 // 出力します。 printWriter.write( 'あ' ); printWriter.write( 'い' ); printWriter.write( 'う' ); // NormalFilterWriter#write() : あ // NormalFilterWriter#write() : い // NormalFilterWriter#write() : う // 1文字単位で出力します。 char[] chars = charArrayWriter.toCharArray(); for( int iF1 = 0; iF1 < chars.length; ++iF1 ) { // 出力します。 System.out.println( chars[iF1] ); } // あ // い // う // このように、printWriterのwrite()メソッドを呼ぶと、 // normalFilterWriterのwrite()メソッドを呼び出し、さらに // charArrayWriterのwrite()メソッドを呼び出します。 // つまり文字出力ストリームが連結して「チェーン」になった // というわけです。 } finally { // 処理が終わったら、最後にclose()メソッドを呼んで // 後処理をします。また、これは必ず行うため、 // finally内で行います。 if( printWriter != null ) { printWriter.close(); } // 処理が終わったら、最後にclose()メソッドを呼んで // 後処理をします。また、これは必ず行うため、 // finally内で行います。 try { if( normalFilterWriter != null ) { normalFilterWriter.close(); } } catch( IOException e ) { // close()メソッドはIOExceptionがthrows指定されているので // 一応受け取ります。 e.printStackTrace(); } // 処理が終わったら、最後にclose()メソッドを呼んで // 後処理をします。また、これは必ず行うため、 // finally内で行います。 if( charArrayWriter != null ) { charArrayWriter.close(); } } } } /** * NormalFilterWriterクラス。 * FilterWriterクラスのサブクラスです。 */ class NormalFilterWriter extends FilterWriter { /** * コンストラクタ。 * 引数に「出力先」となる文字出力ストリームクラスを受け取ります。 * 「中継ぎ」に当たるので、Writerクラスを引数に受け取ります。 */ public NormalFilterWriter( Writer out ) { // 処理はスーパークラスが受け持ってくれるので、 // スーパークラスに渡します。 super( out ); } /** * write()メソッド。 * このクラスを利用する文字出力ストリームクラスの * write()メソッドから呼び出されます。 */ public void write( int c ) throws IOException { // スーパークラスであるFilterWriterクラスの // outフィールドに「出力先」のWriterクラスが // 入っているので、そのwrite()メソッドを呼び出します。 out.write( c ); System.out.println( "NormalFilterWriter#write() : " + (char)c ); } }