【问题标题】:File copying in JavaJava中的文件复制
【发布时间】:2009-09-01 05:43:12
【问题描述】:

什么是更好的选择(就性能而言):使用 fileinputstream 和 fileoutputstream 复制文件或从 Java 运行特定于操作系统的命令复制命令?

【问题讨论】:

    标签: java performance file copy


    【解决方案1】:

    我很确定使用操作系统特定的复制命令会更快,或者至少与简单的自写解决方案一样快。操作系统特定的命令可能会使用合理的缓冲区大小和其他优化,否则您必须自己弄清楚。

    编辑:
    x-x 是对的,你不应该直接调用复制命令。我以为 Java 已经有一个复制方法,比如 File.copy() 什么的,但我找不到任何东西,甚至在 JDIC 中也找不到。所以 Apache Commons IO 可能是要走的路。

    【讨论】:

      【解决方案2】:

      用 Java 实现。

      运行操作系统命令的一个问题是您必须在操作系统内核级别创建一个完整的进程,这是一项重量级操作。有很大的固定开销,这对于较小的文件尤其严重。

      另一个问题是它没有充分的理由添加了系统依赖。

      【讨论】:

        【解决方案3】:

        使用优秀的 commons-io 库,它有一个 method 可以做到这一点。它使用非常广泛,而且非常优化。

        here 下载它,或者如果使用maven,则将POM dependency 复制到您的 pom.xml 文件中。

        不要使用特定于操作系统的副本进行复制,它不会是可移植的。使用来自 java 的非 java 代码,无论是使用 JNI 还是生成外部命令,都是令人头疼和维护的噩梦。

        【讨论】:

        • 假设可移植性不是这里的主要关注点,这种方法的主要用例将涉及复制许多文件作为请求处理的一部分,因此性能是一个非常重要的标准。
        • 即使性能是一个重要标准,但瓶颈将是磁盘而不是 CPU,因此无论您使用哪种语言都无所谓。
        • 一个做文件拷贝的库!!!这对于大约 5 行代码来说有点过火了,不是吗?还是它使用一些神秘的 Java 并发读/写调用来实现最大吞吐量?
        • @Adrian,瓶颈是磁盘速度。文件复制的速度不能超过磁盘的速度,如果你合理的话,它们也不能复制得慢。
        • @x-x:如果我觉得使用这么多内存是安全的,我总是更喜欢使用非常大的复制缓冲区(~16Mb)以避免在操作系统决定交错的情况下磁盘寻道抖动的可能性读写太多。此外,我还看到使用 1 字节缓冲区的文件副本,而且它们通常非常慢。
        【解决方案4】:

        取决于发生错误时您将采取的措施。通常,本机命令能够更好地处理错误情况,但您可能很难让它与用户交互。

        纯 Java 解决方案(除了跨平台)让您可以完全控制 - 我建议使用库来处理混乱的细节和错误情况。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-10-23
          • 2022-12-07
          • 2012-01-06
          • 1970-01-01
          • 2013-07-04
          • 2014-10-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多