I/O

Apache Commons IO

実際のプログラミングでは、Apache Commons IO を利用、あるいは参考にするとよいでしょう。

java.io の基本が詰まっているので、ぜひソースを読んでおく事を推奨します。

InputStream / OutputStream

により byte 単位での入出力を行うことができます。

public static void copy(
        InputStream input, OutputStream output) throws IOException {
    byte[] buffer = new byte[4096];
    int n = 0;
    while (-1 != (n = input.read(buffer))) {
        output.write(buffer, 0, n);
    }
}

は内部バッファを持ちます。都度、ストリームを介すのではなく、内部バッファにデータを溜め込んでおくことで、効率的にストリームにアクセスします。

BufferedOutputStream#write ではバッファに溜め込むだけで、実際に出力が行われるわけではありません。以下の条件で出力が行われます。

  • バッファがいっぱいになった時
  • BufferedOutputStream#flush メソッドにより、任意のタイミングでバッファを出力
  • BufferedOutputStream#close メソッドにより、ストリームを閉じる際にバッファを出力

Reader / Writer

により char 単位での入出力を行うことができます。

public static void copy(
        Reader input, Writer output) throws IOException {
    char[] buffer = new char[4096];
    int n = 0;
    while (-1 != (n = input.read(buffer))) {
        output.write(buffer, 0, n);
    }
}

は、バイトストリーム同様、char 型の内部バッファを持ち、効率的にストリームにアクセスします。