如何检查文件是否可读?

我正在编写Java 6应用程序,我必须检查文件是否可读。 但是,在Windows上, canRead()始终返回true 。 所以我看到可能,唯一的解决方案可能是基于WINAPI并使用JNA / JNI编写的一些本机解决方案。

但是,还有另一个问题,因为在WINAPI中很难找到一个简单的函数,它会返回有关文件访问的信息。 我找到了GetNamedSecurityInfoGetSecurityInfo但我不是一个高级的WINAPI程序员,对于我来说,与JNA / JNI相关的它们太复杂了。 有什么想法如何处理这个问题?

尝试使用以下代码

 public boolean checkFileCanRead(File file){ try { FileReader fileReader = new FileReader(file.getAbsolutePath()); fileReader.read(); fileReader.close(); } catch (Exception e) { LOGGER.debug("Exception when checking if file could be read with message:"+e.getMessage(), e); return false; } return true; } 

你可以用这种方式使用FilePermission和AccessController更强硬:

 FilePermission fp = new FilePermission("file.txt", "read"); AccessController.checkPermission(fp); 

如果允许访问请求,checkPermission将安静地返回。 如果被拒绝,则抛出AccessControlException。

Java 7引入了Files.isReadable静态方法,它接受文件Path并在文件存在且可读时返回true,否则返回false。

来自文档

测试文件是否可读。 此方法检查文件是否存在,以及此Java虚拟机是否具有允许其打开文件以进行读取的适当权限。 根据实现,此方法可能需要读取文件权限,访问控制列表或其他文件属性,以检查对文件的有效访问。 因此,相对于其他文件系统操作,该方法可能不是primefaces的。

请注意,此方法的结果立即过时,无法保证后续尝试打开文件以进行读取将成功(或甚至它将访问同一文件)。 在安全敏感应用程序中使用此方法时应小心。

例:

 File file = new File("/path/to/file"); Files.isReadable(file.toPath()); // true if `/path/to/file` is readable 

如果要阅读它,您只需要知道它是否可读。 因此,只需在需要时尝试阅读,如果不能,请尝试处理。 测试任何资源可用性的最佳方法是尝试使用它并处理出现的exception或错误。 不要试图预测未来。