Java NIO Files.createFile() 失败并出现 NoSuchFileException

标签 java file nio

我正在尝试在开发-测试-产品设置中放置一些核心文件。基本上,如果文件较新,则需要将其复制到下一级作为 QA 流程的一部分。

我正在使用 Java 8,所以我决定第一次尝试 NIO 文件/路径 api。我已经老了,已经有 48 年的编程经验,自 1996 年初以来几乎只使用 Java,并且自预发布以来的每个版本,所以这个 NIO“增强”对我来说应该不会太难吸收,但是。 . .

FileSystem fs = FileSystems.getDefault();
Path in = fs.getPath(fromFileName);
Path out = fs.getPath(toFileName);

if (Files.exists(out)) {
  FileTime inTime = Files.getLastModifiedTime(in);
  FileTime outTime = Files.getLastModifiedTime(out);

  if (0 > outTime.compareTo(inTime)) {
    Files.copy(in, out, StandardCopyOption.REPLACE_EXISTING);
  }
} else {
  Files.createFile(out);
  Files.copy(in, out);
}

我最初只是在不使用 Files.createFile() 的情况下尝试使用 Files.copy(),并在调用 copy() 时遇到了 NoSuchFileException

我查看了几篇 StackOverflow 帖子,其中提到了这一点,其中一篇权威地指出,如果目标文件不存在,copy() 将失败。对于我的生活,我无法理解为什么设计师认为这是一个好主意,但就这样吧。我相应地添加了上面的 createFile() 调用(阅读了文件的 API 文档,其中说 Files.createFile() “创建一个新的空文件,如果文件已经存在则失败。”当我再次运行它时,我得到了准确的结果相同的异常,但在 createFile() 而不是 copy() 上。请注意该路径在我的 Windows 主目录中,因此不会出现访问被拒绝的问题。此外,除了包含此项目的 Eclipse 之外,我的 PC 上没有其他任何东西正在运行这次。

java.nio.file.NoSuchFileException: C:\Users\ChrisGage\myproject\site\ttws\css\core.css
at sun.nio.fs.WindowsException.translateToIOException(Unknown Source)
at sun.nio.fs.WindowsException.rethrowAsIOException(Unknown Source)
at sun.nio.fs.WindowsException.rethrowAsIOException(Unknown Source)
at sun.nio.fs.WindowsFileSystemProvider.newByteChannel(Unknown Source)
at java.nio.file.Files.newByteChannel(Unknown Source)
at java.nio.file.Files.createFile(Unknown Source)
...

我做错了什么?

最佳答案

Files.copy()(和 Files.move())是“愚蠢的”;它不会尝试执行以下任何操作:

  • 复制整个目录层次结构;
  • 移动整个目录层次结构(如果源和目标在不同的文件系统上);
  • 创建丢失的目录等

你需要做的:

final Path tmp = out.getParent();
if (tmp != null) // null will be returned if the path has no parent
    Files.createDirectories(tmp);

在复制文件之前。

关于Java NIO Files.createFile() 失败并出现 NoSuchFileException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27335005/

相关文章:

java - 查询从 "UTF-8"world读取字节到Java "char"

java - HashMap在迭代过程中插入

Java Spring Boot - JavaMailSender 错误

java - ScrollView 屏幕类似于 android 中的主菜单

c++ - 以追加模式打开文件以用 C++ 写入是否会为整个文件分配内存?

linux - 在 linux 上,如何通过系统调用或 shell 命令监视文件/目录的更改?

java - FX :id and initialize() not running in javafx

android - 从 Android 在 Facebook 上发布大视频文件

Java:在 System.in 中使用 NIO

java - Java NIO 中 File.deleteOnExit() 的替代方案?