JavaA2Z

KAB-studio > プログラミング > JavaA2Z > Writerとは

Writer

日本語 書記
英語 writer
ふりがな らいたー
フリガナ ライター

解説

J2SEに含まれるクラスのひとつ。パッケージも含めたクラス名java.io.Writer。
ストリームクラス。全ての文字出力ストリームクラススーパークラスである。
文字出力ストリームクラスの中では「出力先」に位置する。
対になる入力側のクラスReaderクラスである。
 
全ての文字出力ストリームクラススーパークラス
言い換えると、Writerクラスサブクラス文字出力ストリームクラスである、ということになる。
そういったスーパークラスとしての役目だけ持つため、このクラスを直接使用することはない。このクラスサブクラスを使用するか、もしくはサブクラスを作成して使用する。
そもそも抽象クラスであるため、インスタンスを作成することはできない。
基本的には、「出力先」となるクラスはこのWriterクラスサブクラスとし、「中継ぎ」となるクラスFilterWriterクラスサブクラスとする。
 
Writerクラスサブクラスを作成する場合、まず「本当の出力先」を用意する。「本当の出力先」は「文字の並び」を格納できるものとする。たとえばStringBufferクラスchar配列が該当する。また、byte配列への変換処理をえばバイト出力ストリームを指定することもできる。
この「一に並べられた文字データ」を「本当の出力先」とする。
他の文字出力ストリームクラスを「出力先」としてもいいが、それであればWriterクラスではなくFilterWriterクラスサブクラスとした方がいいだろう。
 
Writerクラス抽象クラスであり、write()メソッド抽象メソッドであるため、サブクラスは必ずwrite()メソッドオーバーライドする必要がある。
オーバーライドするwrite()メソッド引数が「( char[], int, int )」のものである。write()メソッドオーバーロードされているが、他のオーバーロードされたメソッド抽象メソッドではないのでオーバーライドする必要はない。また、他のオーバーロードされたメソッドオーバーライドしなければ、「write( char[], int, int )メソッド呼び出してくれるため、このメソッドにのみ処理すればよい。
オーバーライドしたwrite()メソッドでは、「本当の出力先」に出力する処理を実装する。そうすることで、渡された文字を出力することができる。
 
write()メソッドの他に、flush()メソッドclose()メソッドオーバーライドする必要がある。この2つのメソッド抽象メソッドのためである。
flush()メソッドは「フラッシュ」処理をうよう実装する。
close()メソッドは「本当の出力先」を閉じる処理をうよう実装する。特に、出力先がファイルソケットといった、最後に「閉じる」処理が必要な「本当の出力先」の場合には必ずclose()メソッドオーバーライドし、使用時にはfinally呼び出すようにする。

参考サイト


(KAB-studioからのおしらせです)

サンプルプログラム(とか)サンプルを別ウィンドウで表示サンプルをクリップボードへコピー(WindowsでIEの場合のみ)

// Sample.java
import java.io.Writer;
import java.io.PrintWriter;
import java.io.IOException;

public class Sample
{
    public static void main( String[] args )
    {
        NormalWriter normalWriter = null;
        PrintWriter printWriter = null;
        try
        {
            // 「出力先」のNormalWriterクラスを用意します。
            normalWriter = new NormalWriter();

            // このクラスを対象とするPrintWriterクラスを用意します。
            printWriter = new PrintWriter( normalWriter );

            // つまり、

            // PrintWriter
            // ↓
            // NormalWriter

            // という形で、文字出力ストリームクラスが連結したことになります。

            // 出力します。
            printWriter.write( 'あ' );
            printWriter.write( 'い' );
            printWriter.write( 'う' );
            printWriter.write( "えお" );
            // NormalWriter#write( char[], int, int ) : あ
            // NormalWriter#write( char[], int, int ) : い
            // NormalWriter#write( char[], int, int ) : う
            // NormalWriter#write( char[], int, int ) : えお

            // このように、printWriterのwrite()メソッドを呼ぶと、
            // normalWriterのwrite()メソッドを呼び出します。
        }
        finally
        {
            // 処理が終わったら、最後にclose()メソッドを呼んで
            // 後処理をします。また、これは必ず行うため、
            // finally内で行います。
            if( printWriter != null )
            {
                printWriter.close();
                // NormalWriter#close()

                // この結果から分かるとおり、printWriterのclose()メソッドを
                // 呼ぶと、「出力先」のnormalWriterのclose()メソッドも呼び
                // 出されるので、本当は下のclose()メソッドを呼ぶ必要は
                // ありません。でも必ずしも呼ばれるとは限らない
                // (Javadocの仕様に書かれていないので)呼んでおきましょう。
            }

            // 処理が終わったら、最後にclose()メソッドを呼んで
            // 後処理をします。また、これは必ず行うため、
            // finally内で行います。
            try
            {
                if( normalWriter != null )
                {
                    normalWriter.close();
                    // NormalWriter#close()
                }
            }
            catch( IOException e )
            {
                // close()メソッドはIOExceptionがthrows指定されているので
                // 一応受け取ります。
                e.printStackTrace();
            }
        }
    }
}

/**
*   NormalWriterクラス。
*   Writerクラスのサブクラスです。
*/
class NormalWriter extends Writer
{
    /**
    *   write()メソッド。
    *   このクラスを利用する文字出力ストリームクラスの
    *   write()メソッドから呼び出されます。
    *   これをオーバーライドしておけば、他のオーバーロードされた
    *   write()メソッドが呼ばれても、最終的にこのメソッドが呼ばれるので
    *   適切に処理できます。
    */
    public void write( char[] cbuf, int off, int len) throws IOException
    {
        System.out.println( "NormalWriter#write( char[], int, int ) : " + new String( cbuf, off, len ) );
    }

    /**
    *   flush()メソッド。
    *   ストリームをフラッシュするために呼び出されます。
    */
    public void flush() throws IOException
    {
        System.out.println( "NormalWriter#flush()" );
    }

    /**
    *   close()メソッド。
    *   ストリームを閉じるために呼び出されます。
    */
    public void close() throws IOException
    {
        System.out.println( "NormalWriter#close()" );
    }
}
// Sample.java
import java.io.Writer;
import java.io.PrintWriter;
import java.io.IOException;

public class Sample
{
    public static void main( String[] args )
    {
        NormalWriter normalWriter = null;
        PrintWriter printWriter = null;
        try
        {
            // 「出力先」のNormalWriterクラスを用意します。
            normalWriter = new NormalWriter();

            // このクラスを対象とするPrintWriterクラスを用意します。
            printWriter = new PrintWriter( normalWriter );

            // つまり、

            // PrintWriter
            // ↓
            // NormalWriter

            // という形で、文字出力ストリームクラスが連結したことになります。

            // 出力します。
            printWriter.write( 'あ' );
            printWriter.write( 'い' );
            printWriter.write( 'う' );
            printWriter.write( "えお" );
            // NormalWriter#write( char[], int, int ) : あ
            // NormalWriter#write( char[], int, int ) : い
            // NormalWriter#write( char[], int, int ) : う
            // NormalWriter#write( char[], int, int ) : えお

            // このように、printWriterのwrite()メソッドを呼ぶと、
            // normalWriterのwrite()メソッドを呼び出します。
        }
        finally
        {
            // 処理が終わったら、最後にclose()メソッドを呼んで
            // 後処理をします。また、これは必ず行うため、
            // finally内で行います。
            if( printWriter != null )
            {
                printWriter.close();
                // NormalWriter#close()

                // この結果から分かるとおり、printWriterのclose()メソッドを
                // 呼ぶと、「出力先」のnormalWriterのclose()メソッドも呼び
                // 出されるので、本当は下のclose()メソッドを呼ぶ必要は
                // ありません。でも必ずしも呼ばれるとは限らない
                // (Javadocの仕様に書かれていないので)呼んでおきましょう。
            }

            // 処理が終わったら、最後にclose()メソッドを呼んで
            // 後処理をします。また、これは必ず行うため、
            // finally内で行います。
            try
            {
                if( normalWriter != null )
                {
                    normalWriter.close();
                    // NormalWriter#close()
                }
            }
            catch( IOException e )
            {
                // close()メソッドはIOExceptionがthrows指定されているので
                // 一応受け取ります。
                e.printStackTrace();
            }
        }
    }
}

/**
*   NormalWriterクラス。
*   Writerクラスのサブクラスです。
*/
class NormalWriter extends Writer
{
    /**
    *   write()メソッド。
    *   このクラスを利用する文字出力ストリームクラスの
    *   write()メソッドから呼び出されます。
    *   これをオーバーライドしておけば、他のオーバーロードされた
    *   write()メソッドが呼ばれても、最終的にこのメソッドが呼ばれるので
    *   適切に処理できます。
    */
    public void write( char[] cbuf, int off, int len) throws IOException
    {
        System.out.println( "NormalWriter#write( char[], int, int ) : " + new String( cbuf, off, len ) );
    }

    /**
    *   flush()メソッド。
    *   ストリームをフラッシュするために呼び出されます。
    */
    public void flush() throws IOException
    {
        System.out.println( "NormalWriter#flush()" );
    }

    /**
    *   close()メソッド。
    *   ストリームを閉じるために呼び出されます。
    */
    public void close() throws IOException
    {
        System.out.println( "NormalWriter#close()" );
    }
}

この単語を含むページ

はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
Yahoo!ブックマーク 詳細を表示 users
del.icio.us 登録する RSSに登録
サンプルを別ウィンドウで表示
サンプルをクリップボードへコピー(WindowsでIEの場合のみ)
update:2005/11/11
このページは、Javaプログラミング言語についての用語を網羅した辞書「JavaA2Z」の一ページです。
詳しくは「JavaA2Z」表紙の説明をご覧ください。