Java NIO Files.createFile()因NoSuchFileException而失败

时间:2014-12-06 18:31:46

标签: java file nio

我正在尝试在dev-test-prod设置中放置一些核心文件。基本上,如果文件较新,则需要将其作为QA过程的一部分复制到下一级别。

我正在使用Java 8,所以我决定第一次尝试NIO Files / Path apis。我很老了,已经编程了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)
...

我做错了什么?

1 个答案:

答案 0 :(得分:15)

Files.copy()(和Files.move()就此而言)是" dumb&#34 ;;它不会尝试并执行以下任何操作:

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

你需要这样做:

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

在复制文件之前。