[英]Java NIO and Windows disk access
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);
代碼在幾個級別上是錯誤的。
沒有關閉流,異常意味着文件很可能無法寫入。 如果用戶可以實際訪問,則“拒絕訪問”類型的異常指向資源泄漏(即不關閉),這會阻止任何其他操作完成。
你不能像那個w / o循環一樣轉移。 雖然它可以在Windows上運行,但transferTo / From不會一次讀/寫所有內容。 考慮它與inputStream.read() - > outputStream.write()相同,除了它可以使用OS映射的DMA之外,它是相似的。
TransferTo / From在Windows上沒用,因為操作系統不支持它,因此它實際工作的原因是:它是模擬的。 在Linux / Solaris / MacOS上,它只能傳輸X字節並完成它。
你在什么情況下執行? 是否有並發線程使用相同的文件?
如果是這種情況,FileChannel將鎖定正在使用的全部或部分文件。 鎖定方法(部分文件或所有文件)取決於平台,並且Windows 2003已經過時,這種技術已經過時了。
解決方案:更改操作系統或使用apache commons IO。
注意:如果您在一個請求中阻止該文件而您沒有取消阻止,則必須重新啟動jvm。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.