Java NIO和Windows磁盘访问

Java NIO是否需要Windows上的特殊权限?

当我在Windows Server 2003上运行以下Java代码时,它会因“访问被拒绝”错误而失败(这是cygwin终端窗口中的全部消息):

new FileOutputStream(outputFile).getChannel()
  .transferFrom(new FileInputStream(inputFile).getChannel(), 0, Long.MAX_VALUE);

但如果我使用Apache commons-io(我认为它不使用NIO,它可以使用相同的输入和输出文件:

final FileInputStream inputStream = new FileInputStream(inputFile)
final FileOutputStream outputStream = new FileOutputStream(outputStream)
IOUtils.copy(inputStream, outputStream);

我使用管理员帐户在Java 5中运行。 是否有必须设置的特殊文件权限?


原因是在代码中:

new FileOutputStream(outputFile).getChannel() .transferFrom(new FileInputStream(inputFile).getChannel(), 0, Long.MAX_VALUE);

代码在几个层面上是错误的。

  • 没有关闭流,异常意味着该文件很可能无法写入。 如果用户可以实际访问,“拒绝访问”类型的异常指向资源泄漏(即不关闭),从而阻止任何其他操作完成。

  • 你不能像那个无线环路那样转移。 虽然它可以在Windows上运行,但transferTo / From不会一次读取/写入所有内容。 考虑它与inputStream.read() - > outputStream.write()相同,除了它可以使用操作系统映射的DMA之外,它是相似的。

  • 由于操作系统不支持TransferTo / From,因此它实际上起作用的原因是:它是模拟的。 在Linux / Solaris / MacOS上,它可以传输X个字节并完成它。


  • 你在什么情况下执行? 并发线程是否使用同一个文件?

    如果这是你的情况,FileChannel会锁定正在使用的全部或部分文件。 锁定方法(部分文件或全部文件)取决于plataform,而且对于这种技术,windows 2003已经过时了。

    解决方案:更改操作系统或使用apache commons IO。

    注意:如果您在一个请求中阻止文件并且您没有解除阻止,则必须重新启动jvm。

    链接地址: http://www.djcxy.com/p/55621.html

    上一篇: Java NIO and Windows disk access

    下一篇: iCloud makes it possible for users to "steal" In