【问题标题】:Copying file without creating a FileOutputStream复制文件而不创建 FileOutputStream
【发布时间】:2013-05-27 17:53:59
【问题描述】:

我正在制作一个包含文件复制的应用程序,但是当我浏览一个大目录 (1000+) 文件并将它们复制到另一个文件夹时,它使用了 290+ MB 的 RAM。

那么,有什么方法可以在不创建FileOutoutStream 类的新实例的情况下更改FileOutputStream 的File?

编辑:

这是我的 Java 7 API 版本。

Path source = FileSystems.getDefault().getPath(Drive.getAbsolutePath(), files[i].getName());
        Path destination = FileSystems.getDefault().getPath(Save);
        try {
        Files.copy(source, destination);
        } catch (FileAlreadyExistsException e) {
            File file = new File(Save + files[i]);
            file.delete();
        }

请记住,这是在一个 for 循环中,正在对 1000 多个文件计数进行测试。 使用当前方法,我使用 270+ MB 的 RAM

【问题讨论】:

  • 你要关闭你的流吗?
  • Java 的哪个版本?理想的答案取决于它。 Java 7 有一个新的文件 API,它比之前可用的 API 好几倍。
  • 我的是 7u21。但使用 7u17 是一种选择
  • 好的,因为这是 7,去看看Files。请参阅@AndyThomas-Cramer 的答案以获取链接。这个类有一个方便的.copy() 方法...
  • 我已经实现了那个方法,它只占用了我大约 12MB 的 RAM 使用量......这里有什么帮助吗?完成后,我将所有变量都设置为 null,因此被 GC 选中...我不知道为什么它占用了这么多 RAM

标签: java file-io java-7


【解决方案1】:

不,您不能将 FileOutputStream 重定向到其他文件。

如果您使用的是 Java 7,则可以使用新的 Files 类来复制文件。 Files.copy() 方法可以为您完成大部分工作。

否则,请确认您正在关闭您的信息流。在 Java 7 的 try-with-resources 之前,它可能看起来像这样:

FileOutputStream out = null;
try {
    // Create the output stream
    // Copy the file
} catch (IOException e) {
    // Do something
} finally {
    if ( null != out ) {
       try { out.close(); } catch ( IOException ) { }
    }
}

【讨论】:

  • +1,因为 OP 说他使用的是 Java 7!然后你可以提到Files.copy()
  • 为了安全起见,您还需要将 close() 调用包装在 try-catch 块中。这会导致 Java 7 的异常被抑制。
  • @fge - 我曾提到 Files 类,但你说得对,明确提及 Files.copy() 会更清楚。添加了对 Files.copy() 的明确提及。
  • 我以前用commons-io的IOUtils.closeQuietly(...)。 Java 7 的技术更加清晰。
  • 我对第一个答案发表了评论,解释了我对 Java 7 API 的进一步问题
【解决方案2】:

看看这个问题:Standard concise way to copy a file in Java?

具体来说

...,Apache Commons IO 是要走的路,特别是 FileUtils.copyFile();它为您处理所有繁重的工作。

【讨论】:

    【解决方案3】:

    Java 7 的 nio2 怎么样?

    Path source = // ...
    Path target = // ...
    Files.copy(source, target);    
    

    详见Files.copy(...)的javadoc。另见可选参数CopyOption。

    【讨论】:

      猜你喜欢
      • 2016-06-09
      • 2012-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多