FileInputStreamのは、バッファリングされていないと、なぜにBufferedInputStreamが速いですか?

Ruizhi:

IOについては、私は2つの質問があります。

チュートリアルといくつかのStackOverflowの答えはA.、彼らはその主張FileInputStreamバッファリングされていません。本当 ?

次のコード使用FileInputStreamバイト配列にデータを読み出す(1024バイト)

class Test {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("./fos.txt");
        FileOutputStream fos = new FileOutputStream("./copy.txt");

        byte[] buffer = new byte[1024];   // Is this a buffer ? 

        int len;
        while ((len = fis.read(buffer))!= -1) {
            fos.write(buffer);
        }

        fos.close();
        fis.close();
    }
}

APIからは、1行があります:

公共int型の読み取り(バイトb [])にIOExceptionがスローされます

  • @paramのB:データが読み込まれるバッファ。

彼らは両方のバッファリングされている場合B.は、彼らは両方のバッファにデータを入れ、そして正確に作る場所であるバッファからデータをフェッチするBufferedInputStreamよりも速くFileInputStream

ありがとうございました

ピーターLawrey:

チュートリアルといくつかのStackOverflowの回答では、彼らはFileInputStreamのがバッファリングされていないと主張しました。本当 ?

任意のファイルへの書き込みがOSによってバッファされ、しかし、この場合には、それは、Javaでバッファリングされていません。バッファリングを使用すると、多くの小さな書き込みを実行すると、1キロバイトの書き込みは小さくないのに役立ちます。

バイト配列(1024バイト)にデータを読み取るために、次のコードの使用のFileInputStream

    int len;
    while ((len = fis.read(buffer))!= -1) {
        fos.write(buffer);
    }

それはあなたが常に正確に1024バイトを読んで想定しており、ファイルの長さは常に1024の倍数であるとして、このループが壊れています。

代わりに、あなたが読み込まれた長さを記述する必要があります。

    for (int len; (len = fis.read(buffer))!= -1; )
        fos.write(buffer, 0, len);

彼らは両方のバッファリングされている場合は、それらの両方は、バッファにデータを入れて、正確に速くFileInputStreamをよりにBufferedInputStreamを作る場所であるバッファからデータをフェッチ?

この場合、BufferedInputStreamを、デフォルトでは8キロバイトのバッファを使用します。しかし、これは、それだけで8キロバイトを使用するために、あなたのケースで非常に簡単になり、8倍にアップすることにより、システムコールの数を減らすことができますbyte[]し、いくつかの冗長コピーを保存します。

public static void main(String[] args) throws IOException {
    try (FileInputStream fis = new FileInputStream("./fos.txt");
         FileOutputStream fos = new FileOutputStream("./copy.txt")) {

        byte[] buffer = new byte[8 << 10]; // 8 KB
        for (int len; (len = fis.read(buffer)) != -1; )
            fos.write(buffer, 0, len);
    }
}

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=225484&siteId=1