JavaA2Z

KAB-studio > プログラミング > JavaA2Z > 文字出力ストリームとは

文字出力ストリーム

日本語 文字出力流れ
英語 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クラスで十分なことが多いためである。
とりあえずは「テキストファイルを出力するために使う」程度でいいだろう。

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

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

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

この単語を含むページ

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

「サンプルプログラムとか」に含まれているページ

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