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()メソッドを呼び終了処理を行う。
ストリームクラス。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()メソッドを呼び終了処理を行う。
参考サイト
// 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();
}
}
}
}
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();
}
}
}
}
// 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(); } } } }