2013-05-01 187 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

相关问题