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