JavaA2Z

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

BufferedWriter

日本語 緩衝地化書記
英語 buffered writer
ふりがな ばっふぁーどらいたー
フリガナ バッファードライター

解説

J2SEに含まれるクラスのひとつ。パッケージも含めたクラス名java.io.BufferedWriter。
ストリームクラスWriterクラスサブクラスであり、文字出力ストリームクラスである。
文字出力ストリームクラスの中では「中継ぎ」に位置する。
対になる入力側のクラスBufferedReaderクラスである。
 
文字列を「まとめて」出力するための文字出力ストリームクラス
通常、write()メソッド呼び出す度に対象のストリームへと出力されるが、出力先がファイルやネットワークの場合、ある程度の文字数をまとめて出力した方が処理が早まる可能性がある。
そこで、write()メソッドを呼んでもすぐには出力せず、渡された文字列を「バッファ」に保存しておき、貯まった際や任意のタイミングでまとめて出力するのがこのクラスの役目である。
 
また、BufferedWriterクラスは「OSの改行文字」を出力する機能を持つ。
文字出力ストリームクラスは、"\r""\n"といった改行文字をそのまま出力する。だが、システム内の改行文字、特にファイル改行文字はOS毎に異なるため、出力した改行文字が適切ではない場合がある。
BufferedWriterクラスnewLine()メソッドは、OSの標準改行文字を出力するため、適切な改行うことができる。
ただし、同様の機能がPrintWriterクラスprintln()メソッドにもある。
PrintWriterクラスprintln()メソッドにはプリミティブ型を出力する機能もあり、「出力用」クラスとして非常に便利である。
そのため、改行文字を出力するためだけにBufferedWriterクラスを使用する必要はない。あくまで、バッファリングをうために使用するのがいいだろう。
 
BufferedWriterクラスコンストラクタに他のWriterクラスサブクラスを渡すことで、そのクラスを「出力先」として出力する。
BufferedWriterクラスのwrite()メソッドで出力をう。ただし、出力先にはすぐさま出力せず、渡された文字文字列を「バッファ」というBufferedWriterクラス内のフィールドに格納しておく。
そして、flush()メソッドが呼ばれた時や、バッファがいっぱいになった時、close()メソッドが呼ばれた時にまとめてバッファの中身を出力先に出力する。
特に、flush()メソッド呼び出しを「フラッシュ」と言い、まとめて出力することを指す。このフラッシュえることが、BufferedWriterクラスのメリットである。
改行う場合には、"\r""\n"文字列に渡さず、newLine()メソッドを使用して改行文字を出力する。
処理終了後はclose()メソッドを呼び終了処理をう。

参考サイト


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

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

// Sample.java
import java.io.StringWriter;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.io.ByteArrayOutputStream;
import java.io.IOException;

public class Sample
{
    public static void main( String[] args )
    {
        StringWriter stringWriter = null;
        BufferedWriter bufferedWriter = null;
        try
        {
            // StringWriterクラスを作ります。
            stringWriter = new StringWriter();

            // このクラスを対象とするBufferedWriterクラスを作ります。
            bufferedWriter = new BufferedWriter( stringWriter );

            // 文字を書き込みます。
            bufferedWriter.write( 'あ' );
            bufferedWriter.write( 'い' );
            bufferedWriter.write( 'う' );
            // 改行します。
            bufferedWriter.newLine();
            // 残りの文字を書き込みます。
            bufferedWriter.write( "えお" );

            // 出力した文字を文字列として取得します。
            String string = stringWriter.toString();
            // ところが、この段階ではまだ文字列が出力されていません。
            System.out.println( string.length() );
            // 0

            // これは、バッファリングを行うためです。
            // つまり、まとめて出力するために貯えているわけです。

            // というわけで、まとめて出力します。
            // 出力はBufferedWriterクラスのflush()メソッドで行います。
            bufferedWriter.flush();

            // これで出力されました。
            string = stringWriter.toString();
            System.out.println( string );
            // あいう
            // えお
        }
        catch( IOException e )
        {
            // 読み込みに失敗した際に、write()メソッドが
            // IOException例外を投げます。
            e.printStackTrace();
        }
        finally
        {
            // 最後にclose()メソッドを呼んで後処理をします。
            // また、これは必ず行うため、finally内で行います。
            try
            {
                if( bufferedWriter != null )
                {
                    bufferedWriter.close();
                }
            }
            catch( IOException e )
            {
                e.printStackTrace();
            }

            // 最後にclose()メソッドを呼んで後処理をします。
            // また、これは必ず行うため、finally内で行います。
            try
            {
                if( stringWriter != null )
                {
                    stringWriter.close();
                }
            }
            catch( IOException e )
            {
                e.printStackTrace();
            }
        }

        // こちらは、改行文字のテストです。
        ByteArrayOutputStream byteArrayOutputStream = null;
        OutputStreamWriter outputStreamWriter = null;
        try
        {
            // ByteArrayOutputStreamクラスを作ります。
            byteArrayOutputStream = new ByteArrayOutputStream();

            // このクラスを対象とするOutputStreamWriterクラスを作ります。
            outputStreamWriter = new OutputStreamWriter( byteArrayOutputStream );

            // このクラスを対象とするBufferedWriterクラスを作ります。
            bufferedWriter = new BufferedWriter( outputStreamWriter );

            // 文字を書き込みます。
            bufferedWriter.write( "A" );
            // 普通の改行文字を出力します。
            bufferedWriter.write( "\n" );
            // 間の文字列を書き込みます。
            bufferedWriter.write( "B" );
            // newLine()メソッドで改行します。
            bufferedWriter.newLine();
            // 残りの文字を書き込みます。
            bufferedWriter.write( "C" );
            // フラッシュします。
            bufferedWriter.flush();

            // 書き込まれたバイトデータをbyte型配列として取得します。
            byte[] bytes = byteArrayOutputStream.toByteArray();
            forint iF1 = 0; iF1 < bytes.length; ++iF1 )
            {
                // 出力します。
                System.out.println( "0x" + Integer.toHexString( 0x000000FF & bytes[iF1] ) );
            }
            // 0x41  // A
            // 0xa   // \n
            // 0x42  // B
            // 0xd   // \r
            // 0xa   // \n
            // 0x43  // C

            // 注:これはWindowsで試した場合の結果です。
            // Windowsでは、改行文字は\r\nとなります。
            // そのため、newLine()メソッドは\r\nを出力します。
        }
        catch( IOException e )
        {
            // 読み込みに失敗した際に、write()メソッドが
            // IOException例外を投げます。
            e.printStackTrace();
        }
        finally
        {
            // 最後にclose()メソッドを呼んで後処理をします。
            // また、これは必ず行うため、finally内で行います。
            try
            {
                if( bufferedWriter != null )
                {
                    bufferedWriter.close();
                }
            }
            catch( IOException e )
            {
                e.printStackTrace();
            }

            // 最後にclose()メソッドを呼んで後処理をします。
            // また、これは必ず行うため、finally内で行います。
            try
            {
                if( outputStreamWriter != null )
                {
                    outputStreamWriter.close();
                }
            }
            catch( IOException e )
            {
                e.printStackTrace();
            }

            // 最後にclose()メソッドを呼んで後処理をします。
            // また、これは必ず行うため、finally内で行います。
            try
            {
                if( byteArrayOutputStream != null )
                {
                    byteArrayOutputStream.close();
                }
            }
            catch( IOException e )
            {
                e.printStackTrace();
            }
        }
    }
}
// Sample.java
import java.io.StringWriter;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.io.ByteArrayOutputStream;
import java.io.IOException;

public class Sample
{
    public static void main( String[] args )
    {
        StringWriter stringWriter = null;
        BufferedWriter bufferedWriter = null;
        try
        {
            // StringWriterクラスを作ります。
            stringWriter = new StringWriter();

            // このクラスを対象とするBufferedWriterクラスを作ります。
            bufferedWriter = new BufferedWriter( stringWriter );

            // 文字を書き込みます。
            bufferedWriter.write( 'あ' );
            bufferedWriter.write( 'い' );
            bufferedWriter.write( 'う' );
            // 改行します。
            bufferedWriter.newLine();
            // 残りの文字を書き込みます。
            bufferedWriter.write( "えお" );

            // 出力した文字を文字列として取得します。
            String string = stringWriter.toString();
            // ところが、この段階ではまだ文字列が出力されていません。
            System.out.println( string.length() );
            // 0

            // これは、バッファリングを行うためです。
            // つまり、まとめて出力するために貯えているわけです。

            // というわけで、まとめて出力します。
            // 出力はBufferedWriterクラスのflush()メソッドで行います。
            bufferedWriter.flush();

            // これで出力されました。
            string = stringWriter.toString();
            System.out.println( string );
            // あいう
            // えお
        }
        catch( IOException e )
        {
            // 読み込みに失敗した際に、write()メソッドが
            // IOException例外を投げます。
            e.printStackTrace();
        }
        finally
        {
            // 最後にclose()メソッドを呼んで後処理をします。
            // また、これは必ず行うため、finally内で行います。
            try
            {
                if( bufferedWriter != null )
                {
                    bufferedWriter.close();
                }
            }
            catch( IOException e )
            {
                e.printStackTrace();
            }

            // 最後にclose()メソッドを呼んで後処理をします。
            // また、これは必ず行うため、finally内で行います。
            try
            {
                if( stringWriter != null )
                {
                    stringWriter.close();
                }
            }
            catch( IOException e )
            {
                e.printStackTrace();
            }
        }

        // こちらは、改行文字のテストです。
        ByteArrayOutputStream byteArrayOutputStream = null;
        OutputStreamWriter outputStreamWriter = null;
        try
        {
            // ByteArrayOutputStreamクラスを作ります。
            byteArrayOutputStream = new ByteArrayOutputStream();

            // このクラスを対象とするOutputStreamWriterクラスを作ります。
            outputStreamWriter = new OutputStreamWriter( byteArrayOutputStream );

            // このクラスを対象とするBufferedWriterクラスを作ります。
            bufferedWriter = new BufferedWriter( outputStreamWriter );

            // 文字を書き込みます。
            bufferedWriter.write( "A" );
            // 普通の改行文字を出力します。
            bufferedWriter.write( "\n" );
            // 間の文字列を書き込みます。
            bufferedWriter.write( "B" );
            // newLine()メソッドで改行します。
            bufferedWriter.newLine();
            // 残りの文字を書き込みます。
            bufferedWriter.write( "C" );
            // フラッシュします。
            bufferedWriter.flush();

            // 書き込まれたバイトデータをbyte型配列として取得します。
            byte[] bytes = byteArrayOutputStream.toByteArray();
            for( int iF1 = 0; iF1 < bytes.length; ++iF1 )
            {
                // 出力します。
                System.out.println( "0x" + Integer.toHexString( 0x000000FF & bytes[iF1] ) );
            }
            // 0x41  // A
            // 0xa   // \n
            // 0x42  // B
            // 0xd   // \r
            // 0xa   // \n
            // 0x43  // C

            // 注:これはWindowsで試した場合の結果です。
            // Windowsでは、改行文字は\r\nとなります。
            // そのため、newLine()メソッドは\r\nを出力します。
        }
        catch( IOException e )
        {
            // 読み込みに失敗した際に、write()メソッドが
            // IOException例外を投げます。
            e.printStackTrace();
        }
        finally
        {
            // 最後にclose()メソッドを呼んで後処理をします。
            // また、これは必ず行うため、finally内で行います。
            try
            {
                if( bufferedWriter != null )
                {
                    bufferedWriter.close();
                }
            }
            catch( IOException e )
            {
                e.printStackTrace();
            }

            // 最後にclose()メソッドを呼んで後処理をします。
            // また、これは必ず行うため、finally内で行います。
            try
            {
                if( outputStreamWriter != null )
                {
                    outputStreamWriter.close();
                }
            }
            catch( IOException e )
            {
                e.printStackTrace();
            }

            // 最後にclose()メソッドを呼んで後処理をします。
            // また、これは必ず行うため、finally内で行います。
            try
            {
                if( byteArrayOutputStream != null )
                {
                    byteArrayOutputStream.close();
                }
            }
            catch( IOException e )
            {
                e.printStackTrace();
            }
        }
    }
}

この単語を含むページ

「みだし」に含まれているページ

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