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中运行。是否有必须设置的特殊文件权限?
答案 0 :(得分:4)
原因在于代码:
new FileOutputStream(outputFile).getChannel()
.transferFrom(new FileInputStream(inputFile).getChannel(), 0, Long.MAX_VALUE);
代码在几个级别上都是错误的。
没有关闭流,异常意味着文件很可能无法写入。如果用户可以实际访问,“拒绝访问”类型的异常指向资源泄漏(即不关闭),这会阻止任何其他操作完成。
你不能像那个w / o循环一样转移。虽然它可以在Windows上运行,但transferTo / From不会一次读/写所有内容。考虑它与inputStream.read() - > outputStream.write()相同,除了它可以使用操作系统映射的DMA之外,它是相似的。
TransferTo / From在Windows上没用,因为操作系统不支持它,因此它实际工作的原因是:它是模拟的。在Linux / Solaris / MacOS上,它只能传输X字节并完成它。
答案 1 :(得分:0)
你在什么情况下执行?是否有并发线程使用相同的文件?
如果是这种情况,FileChannel会锁定正在使用的全部或部分文件。锁定方法(部分文件或所有文件)取决于平台,并且可以确定Windows 2003已经过时了用于此技术的平台。
解决方案:更改操作系统或使用apache commons IO。
注意:如果您在一个请求中阻止该文件但未取消阻止,则必须重新启动jvm。