2011-10-14 74 views
7

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公地-io(我假設不使用NIO,它與相同的輸入和輸出文件:

final FileInputStream inputStream = new FileInputStream(inputFile) 
final FileOutputStream outputStream = new FileOutputStream(outputStream) 
IOUtils.copy(inputStream, outputStream); 

我在Java 5中使用管理員帳戶運行是否有必須設置一些特殊的文件權限

+0

它可能是一個JVM錯誤。你有沒有試過Java 6或7? –

+0

目前無法升級。公司問題。 – Ralph

+0

是否在任何其他應用程序中打開outputFile?是否所有的應用程序都關閉了,這個outputFile在一個點上打開? Windows可能對它認爲正在使用的文件有奇怪的問題。換句話說,嘗試重新啓動機器,然後立即運行該測試。 – sjngm

回答

4

的原因是在代碼:

new FileOutputStream(outputFile).getChannel() .transferFrom(new FileInputStream(inputFile).getChannel(), 0, Long.MAX_VALUE);

的代碼錯了幾級。

  • 沒有關閉流,異常意味着很可能該文件不可用於寫入。如果用戶可以實際訪問,「拒絕訪問」類型的異常指向資源泄漏(即不關閉),這會阻止任何其他操作完成。

  • 你不能像那個不帶循環那樣轉移。雖然它可以在Windows上運行,但transferTo/From不會一次讀取/寫入所有內容。考慮它與inputStream.read() - > outputStream.write()相同,除了它可以使用操作系統映射的DMA之外,它是相似的。

  • 由於操作系統不支持它,TransferTo/From在Windows上是無用的,因此它實際上起作用的原因是:它是模擬的。在Linux/Solaris/MacOS上,它可以傳輸X個字節並完成它。

+0

謝謝。很好的解釋。 – Ralph

+0

順便說一句,sun.io.ch(和所有的sun. ***)代碼是可用的:http://download.java.net/openjdk/jdk6/ – bestsss

+0

我不是很熟悉Windows API。 TransferTo/From不起作用,因爲API缺少某些東西或者它尚未實現? – Ralph

0

在什麼情況下執行?併發線程是否使用同一個文件?

如果這是你的情況,FileChannel會鎖定正在使用的全部或部分文件。鎖定方法(部分文件或全部文件)取決於plataform,而且對於這種技術,windows 2003已經過時了。

解決方案:更改OS或使用apache commons IO。

注意:如果您在一個請求中阻止該文件並且未解除阻止,則必須重新啓動jvm。

+0

該代碼實際上不適用於任何窗口,但不能用於複製文件。 – bestsss

+0

@bestsss參考你的1rs點和第二段的註釋引用你的第3點(http://docs.oracle.com/javase/6/docs/api/java/nio/channels/FileLock.html)。 一票爲您的答案。我的英語不好,道歉。 – angelcervera