Java 7的Files.isReadable()和isWritable()需要很长时间才能返回
问题描述:
我目前正在迁移到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包。
答
您使用的是什么版本的JRE? 为了解决这个问题,更新到JRE 1.7.0_40 +
问题造成的:
检查Windows上的文件访问是昂贵的,因为它需要 阅读DACL和计算的有效访问到文件。到 绕过此,Windows上的checkAccess实现有一个快速路径 为检查阅读的情况下,但不幸的是Files.isReadable不使用 那个快速路径。
有关详细信息,请参阅:http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7168172
他们立即返回(18毫秒)后,我调用它们。 – johnchen902 2013-05-01 14:15:55
如果使用['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
@Lonenebula不,他们都立刻回来:S – lancex 2013-05-01 14:21:18