Java NIO和Windows磁盘访问

Ral*_*lph 7 java windows file-permissions nio

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

当我在Windows Server 2003上运行以下Java代码时,它失败并出现"拒绝访问"错误(这是cygwin终端窗口中的整个消息):

new FileOutputStream(outputFile).getChannel()
  .transferFrom(new FileInputStream(inputFile).getChannel(), 0, Long.MAX_VALUE);
Run Code Online (Sandbox Code Playgroud)

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

final FileInputStream inputStream = new FileInputStream(inputFile)
final FileOutputStream outputStream = new FileOutputStream(outputStream)
IOUtils.copy(inputStream, outputStream);
Run Code Online (Sandbox Code Playgroud)

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

bes*_*sss 4

原因在代码中:

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

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

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

  • 你不能像那样无循环地传输。虽然它可以在 Windows 上运行,但 TransferTo/From 不会立即读取/写入所有内容。认为它与 inputStream.read()->outputStream.write() 相同,除了可以使用操作系统映射的 DMA 之外,它很相似。

  • TransferTo/From 在 Windows 上毫无用处,因为操作系统不支持它,因此它实际上起作用的原因是:它是模拟的。在 Linux/Solaris/MacOS 上,只需传输 X 个字节即可完成。