我正在尝试在开发-测试-产品设置中放置一些核心文件。基本上,如果文件较新,则需要将其复制到下一级作为 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/