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
?
ありがとうございました
チュートリアルといくつかの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);
}
}