文字出力ストリーム
日本語 | 文字出力流れ |
英語 | character-output stream |
ふりがな | もじしゅつりょくすとりーむ |
フリガナ | モジシュツリョクストリーム |
ストリームの一種。
文字ストリームの一種で、出力を行う。
バイトストリームと異なり、文字を取得するために使用する。
また、文字入力ストリームと異なり、入力ではなく出力を行うために使用する。
具体的には、Writerクラス及びそのサブクラスを指す。
J2SEの以下のクラスが該当する。
・Writer
・CharArrayWriter
・StringWriter
・FileWriter
・PipedWriter
・FilterWriter
・BufferedWriter
・PrintWriter
・OutputStreamWriter
役割で分けると以下のようになる。
■スーパークラス
・Writer
■出力先
・CharArrayWriter
・StringWriter
・FileWriter
・PipedWriter
・OutputStreamWriter
■中継ぎ
・FilterWriter
・BufferedWriter
■出力用
・PrintWriter
「文字」をストリームに出力するためのクラス。
まず、対象とするストリームを元に、「出力先」クラスを決定する。
文字列や文字列配列を対象とするならCharArrayWriterクラスやStringWriterクラスを使用する。
ファイルを対象とするならFileWriterクラスを使用する。
PipedWriterクラスを対象とするならPipedWriterクラスを使用する。
また、出力先がバイト出力ストリームクラスの場合、OutputStreamWriterクラスを使用する。
通常は、コンストラクタで「本当の出力先」を指定することで接続する。
出力先クラスがあれば、基本的にはストリームに文字及び文字列を出力することができる。
write()メソッドで文字及び文字列を出力する。
write()メソッドは5種類の引数にオーバーロードされているが、Stringクラスを引数に持つwrite()メソッドなら文字列を普通に渡せるため、このwrite()メソッドを使用するのがいいだろう。
「出力先」クラスだけでは不便な場合は、「中継ぎ」となるクラスを使用する。
「バッファリング」、つまりストリームに文字列をまとめて出力する場合にはBufferedWriterクラスを使用する。
この「中継ぎ」クラスはコンストラクタにWriterクラスのサブクラスを渡すことができるため、コンストラクタに出力先クラスや他の中継ぎクラスを渡すことで、「出力先←中継ぎ←中継ぎ」のようにチェーン化することができる。
チェーン化すると、出力先の方向へとバケツリレーのようにwriter()メソッドを呼び出し、その際に文字列を渡していき出力先ストリームへと出力する。その呼び出しの間に、中継ぎクラスはバッファリング等の処理を行う。
さらに、文字列出力を容易にする場合には「出力用」のクラスを使用する。
出力用クラスは、文字列を出力する場合に「便利なメソッド」を提供する。write()メソッドは文字列しか出力できないため、write()メソッドでは不便である。
そのため、出力に便利なメソッドを持つ出力用クラスを出力先クラスや中継ぎクラスに接続し、出力用クラスのメソッドを呼ぶようにする。
PrintWriterクラスはprint()メソッド及びprintln()メソッドを持ち、これらはあらゆるプリミティブ型にオーバーロードされているため、プリミティブ型なら全て渡し、文字列へと変換してから出力用クラスを出力先クラスのwrite()メソッドを呼び出して出力する。println()メソッドは出力時に改行も加える。
終了時には、close()メソッドを呼び出す。
出力先のストリームがファイルやソケットである場合、処理後は必ずclose()メソッドを呼び終了処理を行う必要がある。そのため、close()メソッドはfinallyブロック内で行うようにする。
念のため、文字列を扱う出力先クラスや、中継ぎクラス、出力用クラスのclose()メソッドも呼び出す。これは多くの場合必要はないが、呼んでおいた方が精神的にいいだろう。
中継ぎクラス、出力用クラスのclose()メソッドを呼び出すと、ほとんどのクラスはコンストラクタで渡された出力先クラスや中継ぎクラス、つまり「チェーンで連結している先」のclose()メソッドも呼び出すため、本当はチェーンの「実際に使用する側」、つまり出力用クラスか、出力用クラスがなければ中継ぎクラスのclose()メソッドを呼び出せば、接続先の文字出力ストリームクラスのclose()メソッドも呼び出してくれるが、仕様上必ずしもそうとは決められていないため、ひとつずつclose()メソッドを呼び出した方がいいだろう。
ストリームへの出力に失敗したとき等には、IOException例外が投げられる。
特にファイルやソケットが対象の場合、ケーブルが外された、等の外的要因によって出力に失敗する場合があるため、必ず例外の発生に対応する必要がある。
そのため、使用時にはtryブロックで囲み、IOExceptionクラスを拾うようにし、その後finallyブロックでclose()メソッドを呼び出すようにする。
ちなみに、このclose()メソッドもIOException例外を投げるため、これも拾うようにする。閉じる時に投げられる例外のため、行う処理は拾った際にはログの出力等を行うくらいでいいだろう。
このように、出力先クラス、中継ぎクラス、出力用クラスは「チェーン」で接続される。
「出力先クラス←中継ぎクラス←出力用クラス」とチェーン化する場合、まず出力先クラスのインスタンスを作成し、その参照を中継ぎクラスのインスタンス作成時のコンストラクタに渡し、その参照を出力用クラスのインスタンス作成時のコンストラクタに渡す。
このように「接続先の文字出力ストリームクラス」をコンストラクタで渡すことで、write()をメソッドを呼び出すと、接続先のwrite()メソッドが呼ばれる仕組みとなる。
一般的な使用方法としては、以下のようになる。
テキストファイルを出力する場合には、出力先クラスにFileWriterクラス、中継ぎクラスにBufferedWriterクラス、出力用クラスにPrintWriterクラスを使用する。プリミティブ型から文字列への変換はPrintWriterクラスで行い、それをBufferedWriterクラスでまとめて出力し、最後はFileWriterクラスでファイルへと出力する。
ソケットへ文字列を出力する場合には、ソケットから返されるOutputStreamクラスをOutputStreamWriterクラスに継なぎ、さらにBufferedWriterクラスとPrintWriterクラスに継なげるといいだろう。
それ以外の目的に使用することは少ない。文字出力ストリームのため、バイト出力ストリームに比べて対象が少ないこと、単に文字列変換したい場合等にはStringクラスやStringBufferクラスで十分なことが多いためである。
とりあえずは「テキストファイルを出力するために使う」程度でいいだろう。
文字ストリームの一種で、出力を行う。
バイトストリームと異なり、文字を取得するために使用する。
また、文字入力ストリームと異なり、入力ではなく出力を行うために使用する。
具体的には、Writerクラス及びそのサブクラスを指す。
J2SEの以下のクラスが該当する。
・Writer
・CharArrayWriter
・StringWriter
・FileWriter
・PipedWriter
・FilterWriter
・BufferedWriter
・PrintWriter
・OutputStreamWriter
役割で分けると以下のようになる。
■スーパークラス
・Writer
■出力先
・CharArrayWriter
・StringWriter
・FileWriter
・PipedWriter
・OutputStreamWriter
■中継ぎ
・FilterWriter
・BufferedWriter
■出力用
・PrintWriter
「文字」をストリームに出力するためのクラス。
まず、対象とするストリームを元に、「出力先」クラスを決定する。
文字列や文字列配列を対象とするならCharArrayWriterクラスやStringWriterクラスを使用する。
ファイルを対象とするならFileWriterクラスを使用する。
PipedWriterクラスを対象とするならPipedWriterクラスを使用する。
また、出力先がバイト出力ストリームクラスの場合、OutputStreamWriterクラスを使用する。
通常は、コンストラクタで「本当の出力先」を指定することで接続する。
出力先クラスがあれば、基本的にはストリームに文字及び文字列を出力することができる。
write()メソッドで文字及び文字列を出力する。
write()メソッドは5種類の引数にオーバーロードされているが、Stringクラスを引数に持つwrite()メソッドなら文字列を普通に渡せるため、このwrite()メソッドを使用するのがいいだろう。
「出力先」クラスだけでは不便な場合は、「中継ぎ」となるクラスを使用する。
「バッファリング」、つまりストリームに文字列をまとめて出力する場合にはBufferedWriterクラスを使用する。
この「中継ぎ」クラスはコンストラクタにWriterクラスのサブクラスを渡すことができるため、コンストラクタに出力先クラスや他の中継ぎクラスを渡すことで、「出力先←中継ぎ←中継ぎ」のようにチェーン化することができる。
チェーン化すると、出力先の方向へとバケツリレーのようにwriter()メソッドを呼び出し、その際に文字列を渡していき出力先ストリームへと出力する。その呼び出しの間に、中継ぎクラスはバッファリング等の処理を行う。
さらに、文字列出力を容易にする場合には「出力用」のクラスを使用する。
出力用クラスは、文字列を出力する場合に「便利なメソッド」を提供する。write()メソッドは文字列しか出力できないため、write()メソッドでは不便である。
そのため、出力に便利なメソッドを持つ出力用クラスを出力先クラスや中継ぎクラスに接続し、出力用クラスのメソッドを呼ぶようにする。
PrintWriterクラスはprint()メソッド及びprintln()メソッドを持ち、これらはあらゆるプリミティブ型にオーバーロードされているため、プリミティブ型なら全て渡し、文字列へと変換してから出力用クラスを出力先クラスのwrite()メソッドを呼び出して出力する。println()メソッドは出力時に改行も加える。
終了時には、close()メソッドを呼び出す。
出力先のストリームがファイルやソケットである場合、処理後は必ずclose()メソッドを呼び終了処理を行う必要がある。そのため、close()メソッドはfinallyブロック内で行うようにする。
念のため、文字列を扱う出力先クラスや、中継ぎクラス、出力用クラスのclose()メソッドも呼び出す。これは多くの場合必要はないが、呼んでおいた方が精神的にいいだろう。
中継ぎクラス、出力用クラスのclose()メソッドを呼び出すと、ほとんどのクラスはコンストラクタで渡された出力先クラスや中継ぎクラス、つまり「チェーンで連結している先」のclose()メソッドも呼び出すため、本当はチェーンの「実際に使用する側」、つまり出力用クラスか、出力用クラスがなければ中継ぎクラスのclose()メソッドを呼び出せば、接続先の文字出力ストリームクラスのclose()メソッドも呼び出してくれるが、仕様上必ずしもそうとは決められていないため、ひとつずつclose()メソッドを呼び出した方がいいだろう。
ストリームへの出力に失敗したとき等には、IOException例外が投げられる。
特にファイルやソケットが対象の場合、ケーブルが外された、等の外的要因によって出力に失敗する場合があるため、必ず例外の発生に対応する必要がある。
そのため、使用時にはtryブロックで囲み、IOExceptionクラスを拾うようにし、その後finallyブロックでclose()メソッドを呼び出すようにする。
ちなみに、このclose()メソッドもIOException例外を投げるため、これも拾うようにする。閉じる時に投げられる例外のため、行う処理は拾った際にはログの出力等を行うくらいでいいだろう。
このように、出力先クラス、中継ぎクラス、出力用クラスは「チェーン」で接続される。
「出力先クラス←中継ぎクラス←出力用クラス」とチェーン化する場合、まず出力先クラスのインスタンスを作成し、その参照を中継ぎクラスのインスタンス作成時のコンストラクタに渡し、その参照を出力用クラスのインスタンス作成時のコンストラクタに渡す。
このように「接続先の文字出力ストリームクラス」をコンストラクタで渡すことで、write()をメソッドを呼び出すと、接続先のwrite()メソッドが呼ばれる仕組みとなる。
一般的な使用方法としては、以下のようになる。
テキストファイルを出力する場合には、出力先クラスにFileWriterクラス、中継ぎクラスにBufferedWriterクラス、出力用クラスにPrintWriterクラスを使用する。プリミティブ型から文字列への変換はPrintWriterクラスで行い、それをBufferedWriterクラスでまとめて出力し、最後はFileWriterクラスでファイルへと出力する。
ソケットへ文字列を出力する場合には、ソケットから返されるOutputStreamクラスをOutputStreamWriterクラスに継なぎ、さらにBufferedWriterクラスとPrintWriterクラスに継なげるといいだろう。
それ以外の目的に使用することは少ない。文字出力ストリームのため、バイト出力ストリームに比べて対象が少ないこと、単に文字列変換したい場合等にはStringクラスやStringBufferクラスで十分なことが多いためである。
とりあえずは「テキストファイルを出力するために使う」程度でいいだろう。
// Sample.java
import java.io.FileWriter;
import java.io.BufferedWriter;
import java.io.PrintWriter;
import java.io.IOException;
public class Sample
{
public static void main( String[] args )
{
// 出力先のファイルパス。
String filePath = "D:/to.txt";
FileWriter fileWriter = null;
BufferedWriter bufferedWriter = null;
PrintWriter printWriter = null;
try
{
// FileWriterクラスを作ります。
fileWriter = new FileWriter( filePath );
// このクラスを対象とするBufferedWriterクラスを作ります。
bufferedWriter = new BufferedWriter( fileWriter );
// そのクラスを対象とする、PrintWriterクラスを作ります。
printWriter = new PrintWriter( bufferedWriter );
// 出力します。
printWriter.println( "あいうえお" );
printWriter.println( 100 );
printWriter.println( true );
// こうすることで、to.txtに以下のように出力されます。
/*
あいう
えお
*/
// 文字列は、OSの標準文字コードに変換されて出力されます。
// WindowsであればCP932に変換されて出力されます。
}
catch( IOException e )
{
// 読み込みに失敗した際に、write()メソッドが
// IOException例外を投げます。
e.printStackTrace();
}
finally
{
// 最後にclose()メソッドを呼んで後処理をします。
// また、これは必ず行うため、finally内で行います。
if( printWriter != null )
{
printWriter.close();
}
// 最後にclose()メソッドを呼んで後処理をします。
// また、これは必ず行うため、finally内で行います。
try
{
if( bufferedWriter != null )
{
bufferedWriter.close();
}
}
catch( IOException e )
{
e.printStackTrace();
}
// 最後にclose()メソッドを呼んで後処理をします。
// また、これは必ず行うため、finally内で行います。
try
{
if( fileWriter != null )
{
fileWriter.close();
}
}
catch( IOException e )
{
e.printStackTrace();
}
}
}
}
import java.io.FileWriter;
import java.io.BufferedWriter;
import java.io.PrintWriter;
import java.io.IOException;
public class Sample
{
public static void main( String[] args )
{
// 出力先のファイルパス。
String filePath = "D:/to.txt";
FileWriter fileWriter = null;
BufferedWriter bufferedWriter = null;
PrintWriter printWriter = null;
try
{
// FileWriterクラスを作ります。
fileWriter = new FileWriter( filePath );
// このクラスを対象とするBufferedWriterクラスを作ります。
bufferedWriter = new BufferedWriter( fileWriter );
// そのクラスを対象とする、PrintWriterクラスを作ります。
printWriter = new PrintWriter( bufferedWriter );
// 出力します。
printWriter.println( "あいうえお" );
printWriter.println( 100 );
printWriter.println( true );
// こうすることで、to.txtに以下のように出力されます。
/*
あいう
えお
*/
// 文字列は、OSの標準文字コードに変換されて出力されます。
// WindowsであればCP932に変換されて出力されます。
}
catch( IOException e )
{
// 読み込みに失敗した際に、write()メソッドが
// IOException例外を投げます。
e.printStackTrace();
}
finally
{
// 最後にclose()メソッドを呼んで後処理をします。
// また、これは必ず行うため、finally内で行います。
if( printWriter != null )
{
printWriter.close();
}
// 最後にclose()メソッドを呼んで後処理をします。
// また、これは必ず行うため、finally内で行います。
try
{
if( bufferedWriter != null )
{
bufferedWriter.close();
}
}
catch( IOException e )
{
e.printStackTrace();
}
// 最後にclose()メソッドを呼んで後処理をします。
// また、これは必ず行うため、finally内で行います。
try
{
if( fileWriter != null )
{
fileWriter.close();
}
}
catch( IOException e )
{
e.printStackTrace();
}
}
}
}
// Sample.java import java.io.FileWriter; import java.io.BufferedWriter; import java.io.PrintWriter; import java.io.IOException; public class Sample { public static void main( String[] args ) { // 出力先のファイルパス。 String filePath = "D:/to.txt"; FileWriter fileWriter = null; BufferedWriter bufferedWriter = null; PrintWriter printWriter = null; try { // FileWriterクラスを作ります。 fileWriter = new FileWriter( filePath ); // このクラスを対象とするBufferedWriterクラスを作ります。 bufferedWriter = new BufferedWriter( fileWriter ); // そのクラスを対象とする、PrintWriterクラスを作ります。 printWriter = new PrintWriter( bufferedWriter ); // 出力します。 printWriter.println( "あいうえお" ); printWriter.println( 100 ); printWriter.println( true ); // こうすることで、to.txtに以下のように出力されます。 /* あいう えお */ // 文字列は、OSの標準文字コードに変換されて出力されます。 // WindowsであればCP932に変換されて出力されます。 } catch( IOException e ) { // 読み込みに失敗した際に、write()メソッドが // IOException例外を投げます。 e.printStackTrace(); } finally { // 最後にclose()メソッドを呼んで後処理をします。 // また、これは必ず行うため、finally内で行います。 if( printWriter != null ) { printWriter.close(); } // 最後にclose()メソッドを呼んで後処理をします。 // また、これは必ず行うため、finally内で行います。 try { if( bufferedWriter != null ) { bufferedWriter.close(); } } catch( IOException e ) { e.printStackTrace(); } // 最後にclose()メソッドを呼んで後処理をします。 // また、これは必ず行うため、finally内で行います。 try { if( fileWriter != null ) { fileWriter.close(); } } catch( IOException e ) { e.printStackTrace(); } } } }