加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java NIO Files.createFile()以NoSuchFileException失败

发布时间:2020-12-14 05:08:23 所属栏目:Java 来源:网络整理
导读:我试图在dev-test-prod设置中放置一些核心文件.基本上,如果文件较新,则需要将其复制到下一级,作为质量检查过程的一部分. 我使用Java 8,所以我决定第一次尝试NIO Files / Path apis.我是可怕的老,已经编程了48年,自1996年初以来,几乎完全使用了Java,并且自从
我试图在dev-test-prod设置中放置一些核心文件.基本上,如果文件较新,则需要将其复制到下一级,作为质量检查过程的一部分.

我使用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.copy()而没有Files.createFile(),并在copy()调用上得到一个NoSuchFileException.

我看了几个StackOverflow帖子,其中提到这一点,其中之一说明了如果目标文件不存在,copy()将失败.对于我的生活,我不明白为什么设计师认为这是一个好主意,但是如此.我相应地添加了如上所述的createFile()调用(已经读取文件的API文件,该文件说Files.createFile()“创建一个新的和空的文件,如果文件已经存在,则失败”.当我再次运行它时,我确切地说相同的异常,但是在createFile()而不是copy().注意,路径在Windows的主目录中,所以不应该发生访问被拒绝的问题.除了包含此项目的Eclipse之外,还有没有在我的PC上运行这次.

java.nio.file.NoSuchFileException: C:UsersChrisGagemyprojectsitettwscsscore.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);

在复制文件之前.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读