FileOutputStream非常慢

时间:2012-02-11 16:36:52

标签: java android file-io

我正在从网络下载数据库,这些数据库的大小介于100 KB和500 KB之间。这是我的代码(删除无用的代码):

URLConnection uConnection = downloadUrl.openConnection();
InputStream iS = uConnection.getInputStream();
BufferedInputStream bIS = new BufferedInputStream(iS);
byte[] buffer = new byte[1024];
FileOutputStream fOS = new FileOutputStream(db);
int bufferLength = 0;
while ((bufferLength = bIS.read(buffer)) > 0) {
fOS.write(buffer, 0, bufferLength);
}
fOS.close();

我的问题是,他需要很长时间才能完成while语句。我把代码搞砸了吗?这样的小文件不应该花那么长时间,不应该吗?我说的是1分钟,因为三个文件总共不超过1 MB ...提前谢谢!

2 个答案:

答案 0 :(得分:4)

“慢”真的很模糊。话虽如此,考虑到你要做的事情,你不应该使用BufferedInputStream而你的buffer太小了。

缓冲包装器用于优化小型读/写。由于您所做的只是尝试尽可能快地读取大量数据,您应该直接从InputStream读取,并使用大缓冲区(Say,64k,因为底层本机代码可能正在运行无论如何要以那个大小的块数)。

byte[] buffer = new byte[65536];
...
while ((bufferLength = iS.read(buffer, 0, buffer.length) > 0) {
    ...

答案 1 :(得分:-3)

我已经在 Jdk 1.7 中找到了真正的解决方案,这是通过可靠,快速,简单和几乎明确的方式在旧的java.io解决方案上产生可惜的面纱。尽管网络仍然存在大量充分的使用In / out Streams在java中复制文件的例子我会温馨地建议大家使用一个简单的方法 java.nio.Files.copy(Path origin,Path destination) ,带有可选参数,用于替换目标,迁移元数据文件属性,甚至尝试事务移动文件(如果底层操作系统允许)。这是一个非常好的工作,等了这么久!通过将“ .toPath()”附加到File实例(例如 file1.toPath(),可以轻松地从 copy(文件file1,文件file2)转换代码),file2.toPath()。还要注意布尔方法 isSameFile(file1.toPath(),file2.toPath()),已在上面的复制方法中使用但很容易在你想要的每种情况下都可以使用。对于每种情况你都不能使用Apache(commons-io)或Google(guava commons)的社区库升级到1.7。