2012年5月7日月曜日

Javaの入出力(Stream)について

 Javaの入出力は、java.io.* クラスを使って行います。

JavaのStream

 Javaでは、各種データをストリームとして扱うことができます。 ストリームデータには、ファイル内のデータ、標準入力や標準出力、通信データ、文字列データなどがあります。 
 ストリームには、バイト単位に扱う最も下位のクラスと、バッファリングしたり文字コード変換を行うクラスと、行単位で入出力を行うクラスがあり、組み合わせて使います。

バイトストリームを扱うStreamクラス

 バイト単位で扱うストリームで、各種データをバイトストリーム形式に変換するクラスです。

クラス名 機能 形式 入出力
FileInputStream ファイルのデータを読み込むバイトストリームを作成 バイト 入力
FileOutputStream ファイルにデータを書き込むバイトストリームを作成 バイト 出力
Socket::getInputStream() 通信ソケットから受信するバイトストリームを取得 バイト 入力
Socket::getOutPutStream() 通信ソケットに送信するバイトストリームを取得 バイト 出力
ServletRequest::getInputStream() サーブレットのリクエスト入力バイトストリームを取得 バイト 入力
ServletResponse::getOutputStream() サーブレットのレスポンス出力バイトストリームを取得 バイト 出力

バイトストリームと文字ストリームの変換を行うStreamReader/Writerクラス

 バイトストリームと文字ストリームの変換を行うクラスで、InputStreamReaderクラスとOutputStreamWriterクラスがあります。 
 文字コード変換などの機能を持っています。 文字コード変換処理が不要な場合は、使う必要はありません。

クラス名 機能 形式 入出力
InputStreamReader バイトストリームのデータを、文字ストリームに変換
指定された「文字エンコーディング」に従って、文字コード変換
バイト→文字
エンコードあり
入力
OutputStreamWriter 文字ストリームのデータを、バイトストリームに変換
指定された「文字エンコーディング」に従って、文字コード変換
文字→バイト
エンコードあり
出力

 Javaでサポートしている日本語のエンコードには、以下の種類があります。 InputStreamでは、JISAutoDetectを指定すると、文字コードを自動判定しUnicodeに変換してくれます。 当然ですが、Readerクラスでのみ指定可能です。
 文字コードについての詳細は、文字コードについてのページを参考にしてください。 
 JDK1.1では、Java独自形式しかサポートしていませんでしたが、現在では、IANAが規定している標準的なエンコード形式にも対応しています。

Javaエンコード名 対応する文字コード
ISO-2022-JP
ISO2022JP
JISコード(ISO-2022-JP)
Shift_JIS
SJIS
シフトJISコード(Shift_JIS)
EUC-JP
EUC_JP
日本語EUCコード(EUC-JP)
UTF-8 Unicode(UTF-8)
UTF-16 Unicode(UTF-16)
JISAutoDetect 文字コードの自動判定(Readerクラスのみ利用可)

文字ストリームを扱うReader/Writerクラス

 文字ストリームを扱うクラスで、行単位の入出力が可能なクラスです。 Streamクラスや、StreamReader/StreamWriterクラスと組み合わせて利用します。 
 バッファリングせずにバイト単位で処理する場合は、使う必要はありません。

クラス名 機能 形式 入出力
BufferedReader 文字、配列、行をバッファリングして、文字ストリームから効率良く入力 文字 入力
BufferedWriter 文字、配列、行をバッファリングして、文字ストリームに効率良く出力 文字 出力
PrintWriter フォーマットされたオブジェクトの表現を文字ストリームに出力 文字 出力

ソースの記述例

import java.io.*;    // ファイルからバイト単位で読み込む例  FileInputStream in = new FileInputStream("ファイル名");  // ファイルからバイト単位で書き込む例  FileOutputStream out = new FileOutputStream("ファイル名");    // Shift_JISのファイルから文字コード変換して読み込む例  BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream("ファイル名"), "Shift_JIS"));  // Shift_JISのファイルから文字コード変換して書き込む例  PrintWriter out = new PrintWriter(new OutputStreamWriter(new FileOutputStream("ファイル名"), "Shift_JIS"));    // サーブレットでリクエストデータを文字コードを自動変換して読み込む例  BufferedReader in = new BufferedReader(new InputStreamReader(req.getInputStream(), "JISAutoDetect"));  // サーブレットでレスポンスデータをEUCコードに変換して書き込む例  PrintWriter out = new PrintWriter(new OutputStreamWriter(res.getOutputStream(), "EUC-JP"));

0 件のコメント:

コメントを投稿