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")); |