ストリームの種類
ストリームには大別すると2種類あって、バイトと文字がある。- バイトストリーム
- InputStream
- OutputStream
- 文字ストリーム
- Reader
- Writer
InputStreamのサンプル
引数で与えられたファイルのバイト数を返す。FileInputStreamについては後述。import java.io.*;
class InputStreamSample {
public static void main(String[] args)
{
InputStream in = null;
try {
if (args.length == 0)
in = System.in;
else
in = new FileInputStream(args[0]);
int total = 0;
while (in.read() != -1)
total++;
System.out.println(total + " bytes");
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (in != null) {
in.close();
}
} catch (IOException e) {
}
}
}
}
OutputStreamのサンプル
引数を2つ必要とし、第1引数に変換前の文字、第2引数に変換後の文字をいれる。その後入力待ち状態となり、入力した文字を変換しながら表示する。
import java.io.*;
class OutputStreamSample {
public static void main(String[] args)
{
// charAt(0):0番目の文字コードを取得
byte from = (byte) args[0].charAt(0);
byte to = (byte) args[1].charAt(0);
int b = 0;
try {
while ((b = System.in.read()) != -1)
System.out.write(b == from? to: b);
} catch (IOException e) {
e.printStackTrace();
}
}
}
ファイルの読み書き
文字ストリームとバイトストリームには、それぞれにFileから読み込むためのクラスがある。- バイト
- FileInputStream
- FileOutputStream
- 文字
- FileReader
- FileWriter
/*Reader*/
バッファリング
データの読み書きは前述のように大抵ファイルかネットワークでこれらはメモリより全然遅い。前述のクラスは、1バイト単位、1文字単位で読み込むことになり効率が悪い。
そこで、ほとんどのケースでバッファリングクラスを介して前述のクラスを使用する。
- バイトストリーム
- BufferdInputStream
- BufferdOutputStream
- 文字ストリーム
- BufferdIReader
- BufferdIWriter
ストリーム系クラスは、インスタンス生成時にどんどんくるむ。これをデコレータパターンという。
典型的な例。
/* ここにコード例 */
注意すべきは、ストリームをクローズするときは、その一番外側のクラスだけをクローズすればよいということ。
closeが失敗するのはディスクフルの書き込み失敗ぐらいで、読み込みじにクローズが失敗することは殆どない。
基本的に必ずfinally句に書くようにすれば良い。
/* ここにコード例 */
0 件のコメント:
コメントを投稿