JavaA2Z

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

OutputStreamWriter

日本語 出力流れ書記
英語 output stream writer
ふりがな あうとぷっとすとりーむらいたー
フリガナ アウトプットストリームライター

解説

J2SEに含まれるクラスのひとつ。パッケージも含めたクラス名java.io.OutputStreamWriter。
ストリームクラスWriterクラスサブクラスであり、文字出力ストリームクラスである。
文字出力ストリームクラスの中では「中継ぎ」に位置する。
対になる入力側のクラスInputStreamReaderクラスである。
 
文字出力ストリームの「中継ぎ」クラススーパークラス
「出力用」→「中継ぎ」→「出力先」という連携の中で、「出力用」に渡した文字データを書き換えたりといった「中間位置での立ち回り」をクラスの、スーパークラスとなるクラスである。
ただし、OutputStreamWriterクラスは「出力先」をバイト出力ストリーム、つまりOutputStreamクラスに限定している。
つまり、OutputStreamWriterクラスは、WriterクラスサブクラスOutputStreamクラスサブクラスの「仲介役」となるクラスである。
 
文字は、バイナリーデータの一種である。
文字出力ストリームは、バイト出力ストリームの一種である、ということが言える。
そのため、文字出力ストリームバイト出力ストリームへと変換し渡す必要がある場合がある。その時に使用するのがOutputStreamWriterクラスである。
OutputStreamWriterクラスOutputStreamクラスサブクラスを受け取り、outフィールドに持つ。
write()メソッドが呼び出され文字もしくは文字列が渡された場合、指定された文字コード(指定されていない場合にはOS標準の文字コード)の形式でbyte配列へと変換し、outフィールドのwrite()メソッドへとbyte配列を渡し出力する。
つまり、「文字列」というデータを、特定文字コードの「byte配列」へと変換し、バイト出力ストリームへと出力するのがOutputStreamWriterクラスの役目である。
  
OutputStreamWriterクラスコンストラクタに「出力先」となるOutputStreamクラスサブクラスを渡す。また、任意の文字コードに変換する場合には、第2引数文字コードを指定する。指定されなかった場合には、OS標準の文字コードに変換する。たとえばWindowsであればCP932に変換することになる。
OutputStreamWriterクラスのwrite()メソッド呼び出し文字もしくは文字列が渡すと、指定された文字コードに変換してからbyte配列の形式にし、これを「出力先」の「OutputStreamクラスサブクラス」のwrite()メソッドへと渡す。
処理終了後はclose()メソッドを呼び終了処理をう。

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

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

// Sample.java
import java.io.ByteArrayOutputStream;
import java.io.PrintWriter;
import java.io.OutputStreamWriter;
import java.io.IOException;
import java.io.UnsupportedEncodingException;

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

            // このクラスを対象とするOutputStreamWriterクラスを用意します。
            outputStreamWriter = new OutputStreamWriter( byteArrayOutputStream, "UTF-8" );

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

            // つまり、

            // PrintWriter
            // ↓
            // OutputStreamWriter
            // ↓
            // ByteArrayOutputStream

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

            // 出力します。
            printWriter.write( 'あ' );
            printWriter.write( 'い' );
            printWriter.write( 'う' );
            // フラッシュして出力します。
            printWriter.flush();

            // 書き込まれたバイトデータをbyte型配列として取得します。
            byte[] bytes = byteArrayOutputStream.toByteArray();
            forint iF1 = 0; iF1 < bytes.length; ++iF1 )
            {
                // 出力します。
                System.out.println( "0x" + Integer.toHexString( 0x000000FF & (int)bytes[iF1] ) );
            }
            // 0xe3   // 「あ」の1バイト目。
            // 0x81   // 「あ」の2バイト目。
            // 0x82   // 「あ」の3バイト目。
            // 0xe3   // 「い」の1バイト目。
            // 0x81   // 「い」の2バイト目。
            // 0x84   // 「い」の3バイト目。
            // 0xe3   // 「う」の1バイト目。
            // 0x81   // 「う」の2バイト目。
            // 0x86   // 「う」の3バイト目。

            // (注:全てUTF-8の文字コードです。UTF-8なのは、
            // OutputStreamWriterクラスのコンストラクタで
            // 指定しているからです)

            // このように、printWriterのwrite()メソッドを呼ぶと、
            // outputStreamWriterのwrite()メソッドを呼び出し、さらに
            // byteArrayOutputStreamのwrite()メソッドを呼び出します。
            // つまり文字出力ストリームとバイト出力ストリームが連結して
            // 「チェーン」になったというわけです。
            // また、出力する際、指定した文字コードに変換し、
            // byte型配列に変換してから、出力先のバイト出力ストリームに
            // 出力するというわけです。
        }
        catch( UnsupportedEncodingException e )
        {
            // 指定した文字コードが存在しない場合には
            // UnsupportedEncodingException例外が投げられます。
            e.printStackTrace();
        }
        finally
        {
            // 処理が終わったら、最後にclose()メソッドを呼んで
            // 後処理をします。また、これは必ず行うため、
            // finally内で行います。
            if( printWriter != null )
            {
                printWriter.close();
            }

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

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

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

            // このクラスを対象とするOutputStreamWriterクラスを用意します。
            outputStreamWriter = new OutputStreamWriter( byteArrayOutputStream, "UTF-8" );

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

            // つまり、

            // PrintWriter
            // ↓
            // OutputStreamWriter
            // ↓
            // ByteArrayOutputStream

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

            // 出力します。
            printWriter.write( 'あ' );
            printWriter.write( 'い' );
            printWriter.write( 'う' );
            // フラッシュして出力します。
            printWriter.flush();

            // 書き込まれたバイトデータをbyte型配列として取得します。
            byte[] bytes = byteArrayOutputStream.toByteArray();
            for( int iF1 = 0; iF1 < bytes.length; ++iF1 )
            {
                // 出力します。
                System.out.println( "0x" + Integer.toHexString( 0x000000FF & (int)bytes[iF1] ) );
            }
            // 0xe3   // 「あ」の1バイト目。
            // 0x81   // 「あ」の2バイト目。
            // 0x82   // 「あ」の3バイト目。
            // 0xe3   // 「い」の1バイト目。
            // 0x81   // 「い」の2バイト目。
            // 0x84   // 「い」の3バイト目。
            // 0xe3   // 「う」の1バイト目。
            // 0x81   // 「う」の2バイト目。
            // 0x86   // 「う」の3バイト目。

            // (注:全てUTF-8の文字コードです。UTF-8なのは、
            // OutputStreamWriterクラスのコンストラクタで
            // 指定しているからです)

            // このように、printWriterのwrite()メソッドを呼ぶと、
            // outputStreamWriterのwrite()メソッドを呼び出し、さらに
            // byteArrayOutputStreamのwrite()メソッドを呼び出します。
            // つまり文字出力ストリームとバイト出力ストリームが連結して
            // 「チェーン」になったというわけです。
            // また、出力する際、指定した文字コードに変換し、
            // byte型配列に変換してから、出力先のバイト出力ストリームに
            // 出力するというわけです。
        }
        catch( UnsupportedEncodingException e )
        {
            // 指定した文字コードが存在しない場合には
            // UnsupportedEncodingException例外が投げられます。
            e.printStackTrace();
        }
        finally
        {
            // 処理が終わったら、最後にclose()メソッドを呼んで
            // 後処理をします。また、これは必ず行うため、
            // finally内で行います。
            if( printWriter != null )
            {
                printWriter.close();
            }

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

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

この単語を含むページ

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

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