如何优化java中的复制时间?

时间:2016-01-03 15:09:27

标签: java performance io

是否可以加快执行时间?

import java.io.*;

public class CopyFile {

  public static void main(String[] args) throws Exception {
    final long start = System.nanoTime();

    InputStream in = new FileInputStream("test.pdf");
    OutputStream out = new FileOutputStream("test_copy.pdf");

    int c;
    while ( (c = in.read()) != -1 )
        out.write(c);

    in.close();
    out.close();

    System.out.println("Took " + (System.nanoTime() - start) / 1000_000 + "ms to finish");

  }    
}

4 个答案:

答案 0 :(得分:2)

使用固定大小的缓冲区可能会产生更好的性能,因为您一次只能读取超过1个字节的数据。这是通过调用read(b)并给出初始化的字节数组来完成的。

但是,我强烈建议您不要重新发明轮子。您可以使用自Java 7以来提供的设施Java NIO.2 APIFiles.copy(source, target, options...)):

Files.copy(Paths.get("test.pdf"), Paths.get("test_copy.pdf"));

如果您想要对副本进行更多控制,可以将options作为第三个变量参数提供给此调用,如StandardCopyOption.REPLACE_EXISTING将替换目标文件(如果已存在)。

Files.copy(Paths.get("test.pdf"), Paths.get("test_copy.pdf"), StandardCopyOption.COPY_ATTRIBUTES);

答案 1 :(得分:1)

使用BufferedInputStreamBufferedOutputStream可以提高效率,但最好不要重新发明轮子:

Files.copy(Paths.get("test.pdf"), Paths.get("test_copy.pdf"))

答案 2 :(得分:0)

你可以做到

public static void main(String[] args) throws Exception {
    final long start = System.currentTimeMillis();
    Files.copy(Paths.get("test.pdf"), Paths.get("test_copy.pdf"));

    long time = System.currentTimeMillis() - start;
    System.out.println("Took " + time + "ms to finish");

  }  

答案 3 :(得分:0)

使用java运行时并调用特定于操作系统的命令来完成工作。它将确保在操作系统级别上进行复制。