簡體   English   中英

Java NIO和Windows磁盤訪問

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM