【问题标题】:FileAlreadyExistsException when using Files.copy使用 Files.copy 时出现 FileAlreadyExistsException
【发布时间】:2017-07-10 06:20:26
【问题描述】:

我正在尝试将文件从InputStream 复制到本地目录中。我创建了一个名为 test 的本地目录,它位于我的包根目录中。

public void copyFileFromInputStream(InputStream is) {
    Path to = Paths.get("test");
    Files.copy(is, to);
}

显然我误解了Files.copy(...),因为它似乎试图创建一个名为“test”的新文件,而不是将文件放入目录“test”中。

如何将文件写入目录?

【问题讨论】:

  • 使用FileOutputStreamFileWriter
  • 不,不要使用FileOutputStreamFileWriterFiles.copy很好,他们只需要阅读文档,目标是文件,而不是目录(答案是正确的)

标签: java file


【解决方案1】:

首先创建新目录,然后将流复制到该目录中的新文件:

Path to = Paths.get("mynewdir/test");
Files.copy(is, to);

还请记住,您的 InputStream 没有文件名,因此在将流写入磁盘时始终需要提供文件名。在您的示例中,它确实会尝试创建一个文件“test”,但显然这是一个已经存在的文件夹(因此出现异常)。所以你需要指定完整的文件名。

【讨论】:

    【解决方案2】:

    这里是你问题的答案:

    参考你的代码 sn-p: Paths.get("test"); 您正在询问当前目录中名为“test”的文件的文件路径,而不是目录。 如果要引用当前目录下的 test 目录下的文件。使用以下内容: Paths.get("test/filename.ext") 要写入流数据。

    如果您运行您的应用两次,您会收到“FileAlreadyExistsException”,因为 Files 上的复制方法会写入新文件,如果存在则不会覆盖它。

    希望对你有帮助!

    【讨论】:

      【解决方案3】:

      Files.copy(from, to) 的 'to' 参数是目标文件的路径。

      尝试指定测试目录中的文件名:

      Path to = Paths.get("test/newfilename");
      Files.copy(is, to);
      

      【讨论】:

        【解决方案4】:

        您可以使用选项StandardCopyOption.REPLACE_EXISTING

            public void copyFileFromInputStream(InputStream is) {
                Path to = Paths.get("test");
                Files.copy(is, to, StandardCopyOption.REPLACE_EXISTING);
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-01-04
          • 1970-01-01
          • 1970-01-01
          • 2020-05-23
          • 1970-01-01
          • 2019-12-19
          • 1970-01-01
          相关资源
          最近更新 更多