关于IO,我有两个问题。
A.在教程和一些StackOverflow的答案,他们声称,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,有一行:
公共INT读(字节B [])抛出IOException异常
- @参数B:到其中的数据被读出缓冲器。
B.如果它们都缓冲,他们都将数据放入缓冲区,并获取数据从缓存,这里恰恰是地方,使BufferedInputStream
速度比FileInputStream
?
谢谢
在教程和一些StackOverflow的答案,他们声称的FileInputStream不会被缓冲。真的吗 ?
写入任何文件是由OS缓冲,然而,在这种情况下,它不是由Java的缓冲。缓冲帮助,当你执行许多小型写入,1 KB写不小。
下面的代码使用的FileInputStream将数据读入一个字节数组(1024个字节)
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);
如果他们都被缓冲,他们都将数据放入缓冲区,从缓冲区,其中究竟是使的BufferedInputStream比的FileInputStream快的地方获取数据?
在这种情况下,的BufferedInputStream将默认使用的8 KB缓冲区。这将最多不过减少系统调用的次数为8的一个因素,它会在你的情况要简单得多,只需使用一个8 KB 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);
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句