2013-05-01 127 views
0

我目前正在遷移到Java 7,並試圖將所有類都轉換爲使用新的java.nio.file包。在一個點上,我嘗試檢查文件是否可讀和什麼類似於下面的代碼可寫:Java 7的Files.isReadable()和isWritable()需要很長時間才能返回

MyClass myObject = new MyClass(); 
Path path = Paths.get("testDir/sub1/sub2/test.txt"); 
myObject.setReadable(Files.isReadable(path)); 
myObject.setWritable(Files.isWritable(path)); 

當我測試這個使用JUnit(在Windows 7),這兩個​​和isWritable();始終掛25秒每個回來之前。這是非常不可接受的。這可能是Windows的限制嗎?
我的應用程序最終將在unix上運行,但我還沒有機會對它進行測試。我想我應該指出,每一個我測試文件是用下面的代碼創建:

Files.createFile(Paths.get("testDir/sub1/sub2/test.txt")); 

有什麼我可以做,以幫助加快速度吧?謝謝!

編輯: 因此,似乎path.toFile().canRead()立即返回,canWrite()相同。如果涉及到它,我可以使用這些方法,但我真的只想使用java.nio.file包。

+0

他們立即返回(18毫秒)後,我調用它們。 – johnchen902 2013-05-01 14:15:55

+0

如果使用['File#canRead'](http://docs.oracle.com/javase/7/docs/api/java/io/File.html#canRead())和['File #canWrite'(http://docs.oracle.com/javase/7/docs/api/java/io/File.html#canWrite())? – 2013-05-01 14:17:49

+0

@Lonenebula不,他們都立刻回來:S – lancex 2013-05-01 14:21:18

回答

0

您使用的是什麼版本的JRE? 爲了解決這個問題,更新到JRE 1.7.0_40 +

問題造成的:

檢查Windows上的文件訪問是昂貴的,因爲它需要 閱讀DACL和計算的有效訪問到文件。到 繞過此,Windows上的checkAccess實現有一個快速路徑 爲檢查閱讀的情況下,但不幸的是Files.isReadable不使用 那個快速路徑。

有關詳細信息,請參閱:http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7168172

相關問題