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 );
}
}




