0

我有这个 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(),有没有更好的方法来做到这一点?我试图将输出流置于循环之外,但它不起作用。

4

3 回答 3

1

close() 最多可能需要 20 毫秒。我怀疑这是你的程序,除非你有 1000 个文件。

我怀疑您的性能问题是缺乏缓冲输入和输出。你能展示你的缓冲包装器吗?

于 2011-04-26T15:43:37.230 回答
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关闭流时可能抛出的 s 必须被忽略,否则您将丢失潜在的初始异常。

另一个问题是两个流都在同一个文件上,这是行不通的。所以我想你正在使用两个不同的文件。

于 2011-04-26T15:48:05.740 回答
0

您当然可以构建一个 OutputStreams 队列并将其卸载到处理这些输出流关闭的后台线程。输入流也一样。或者,您可以将其留给 JVM 来执行 - 只需在对象完成时不要关闭文件并将其留给 GC 来执行此操作。

于 2011-04-26T15:46:43.073 回答