Java NIO是否需要Windows上的特殊权限?
当我在Windows Server 2003上运行以下Java代码时,它会失败,出现“访问被拒绝”错误(这是cygwinterminal窗口中的整个消息):
new FileOutputStream(outputFile).getChannel() .transferFrom(new FileInputStream(inputFile).getChannel(), 0, Long.MAX_VALUE);
但是如果我使用Apache commons-io(我认为它不使用NIO,它使用相同的input和输出文件:
final FileInputStream inputStream = new FileInputStream(inputFile) final FileOutputStream outputStream = new FileOutputStream(outputStream) IOUtils.copy(inputStream, outputStream);
我使用pipe理员帐户在Java 5中运行。 是否有必须设置的特殊文件权限?
原因是在代码中:
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字节并完成它。
你在什么情况下执行? 有没有并发线程使用相同的文件?
如果这是你的情况,FileChannel锁定全部或部分正在使用的文件。 锁定方法(部分文件或全部文件)取决于plataform,而且对于这种技术,windows 2003已经过时了。
解决方案:更改操作系统或使用Apache公共IO。
注意:如果您在一个请求中阻止文件,而您没有解除阻止,则必须重新启动jvm。