我有这个ArrayList文件
for(File file : files){
InputStream in = FileInputStream(file);
// process each file and save it to file
OutputStream out = FileOutputStream(file);
try{
} finally {
in.close();
out.close();
}
}
性能非常慢,因为每个循环都有一个输入/输出close(),有更好的方法吗?我试图把循环的outputstream oustide,它不起作用。
答案 0 :(得分:1)
关闭()最多可能需要20毫秒。我怀疑这是你的程序,除非你有1000个文件。
我怀疑你的性能问题是缺乏缓冲输入和输出。你能展示你的缓冲包装吗?
答案 1 :(得分:1)
使用缓冲流会产生巨大的差异。
试试这个:
for(final File file : files) {
final InputStream in = new BufferedInputStream(new FileInputStream(file));
final OutputStream out = new BufferedOutputStream(new FileOutputStream(new File(...)));
try {
// Process each file and save it to file
}
finally {
try {
in.close();
}
catch (IOException ignored) {}
try {
out.close();
}
catch (IOException ignored) {}
}
}
请注意,必须忽略关闭流时可以抛出的IOException
,否则您将丢失潜在的初始异常。
另一个问题是两个流都在同一个文件上,这不起作用。所以我想你正在使用两个不同的文件。
答案 2 :(得分:0)
您当然可以构建一个OutputStreams队列并将其卸载到后台线程,该后台线程处理这些输出流的关闭。对于InputStreams也是如此。 或者,您可以将其留给JVM来执行此操作 - 只需关闭文件并将其留给GC,以便在对象完成时执行此操作。