【问题标题】:On OSX and JVM 7, FileChannel.open seems to be broken在 OSX 和 JVM 7 上,FileChannel.open 似乎已损坏
【发布时间】:2014-12-09 14:48:41
【问题描述】:

在带有 JVM 7 的 OSX 上,我看到带有 CREATE_NEW 的 FileChannel.open 似乎不符合 docs。下面的代码,我希望创建一个新文件,并且只有当它不能(权限,磁盘问题)或文件已经存在时才会失败。

scala> FileChannel.open(new File("/tmp/doesnotexist").toPath, StandardOpenOption.CREATE_NEW)
java.nio.file.NoSuchFileException: /tmp/doesnotexist
  at sun.nio.fs.UnixException.translateToIOException(UnixException.java:86)
  at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102)
  at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107)
  at sun.nio.fs.UnixFileSystemProvider.newFileChannel(UnixFileSystemProvider.java:177)
  at java.nio.channels.FileChannel.open(FileChannel.java:287)
  at java.nio.channels.FileChannel.open(FileChannel.java:334)
  ... 32 elided

scala> val path = new File("/tmp/doesnotexist")
path: java.io.File = /tmp/doesnotexist

scala> path.createNewFile()
res9: Boolean = true

scala> FileChannel.open(path.toPath, StandardOpenOption.CREATE_NEW)
res10: java.nio.channels.FileChannel = sun.nio.ch.FileChannelImpl@19fed8d0

scala> FileChannel.open(path.toPath, StandardOpenOption.CREATE_NEW)
res11: java.nio.channels.FileChannel = sun.nio.ch.FileChannelImpl@5c6ff75

scala> FileChannel.open(path.toPath, StandardOpenOption.CREATE_NEW)
res12: java.nio.channels.FileChannel = sun.nio.ch.FileChannelImpl@1fa547d1

这是我正在使用的 Java

$ java -version
java version "1.7.0_55"
Java(TM) SE Runtime Environment (build 1.7.0_55-b13)
Java HotSpot(TM) 64-Bit Server VM (build 24.55-b03, mixed mode)

这是一个文档(或文档的解释)问题,还是 OSX 上的错误(甚至可能是 linux?尚未测试)?

【问题讨论】:

    标签: java macos jvm


    【解决方案1】:

    您必须与 CREATE_NEW 一起指定 WRITE。我刚刚在我的 OS X 上为您测试了它,它按预期工作:

    FileChannel.open(Paths.get("/tmp/doesnotexist"), StandardOpenOption.CREATE_NEW, StandardOpenOption.WRITE);
    

    【讨论】:

    • 看到解决方案后,似乎很明显。但是当我想创建一个(锁定的)文件而不写入它时,它就不是那么简单了。
    【解决方案2】:

    特别不是这个问题的答案,因为我确定 /tmp 存在于您的系统上,但通常,您需要确保父目录也已经存在。如果一个或多个父目录不存在,您将得到相同的异常。

    【讨论】:

      猜你喜欢
      • 2015-05-09
      • 2016-01-14
      • 2013-05-23
      • 2020-03-18
      • 1970-01-01
      • 2021-12-10
      • 2016-05-27
      • 2013-07-07
      • 1970-01-01
      相关资源
      最近更新 更多