我正在编写Java 6应用程序,我必须检查文件是否可读。但是,在Windows canRead()
上始终返回true
。所以我看到可能,唯一的解决方案可能是基于WINAPI并用JNA / JNI编写的一些本机解决方案。
但是,还有另一个问题,因为在WINAPI中很难找到一个简单的函数,它会返回有关访问文件的信息。我找到了GetNamedSecurityInfo
或GetSecurityInfo
,但我不是高级的WINAPI程序员,而且对于我来说,与JNA / JNI相关的它们太复杂了。任何想法如何处理这个问题?
答案 0 :(得分:8)
尝试使用以下代码
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;
}
答案 1 :(得分:5)
您可以这样使用FilePermission和AccessController更强硬:
FilePermission fp = new FilePermission("file.txt", "read");
AccessController.checkPermission(fp);
如果允许访问请求,checkPermission将安静地返回。如果 否认,抛出AccessControlException。
答案 2 :(得分:5)
Java 7引入了Files.isReadable
静态方法,它接受文件Path
,如果文件存在且可读则返回true,否则返回false。
测试文件是否可读。此方法检查文件是否存在 并且该Java虚拟机具有适当的权限 允许它打开文件进行阅读。这取决于实施 方法可能需要读取文件权限,访问控制列表或 其他文件属性,以检查对文件的有效访问。 因此,该方法相对于其他文件可能不是原子的 系统运作。
请注意,此方法的结果会立即过时,有 不保证随后尝试打开文件进行阅读 成功(甚至它将访问同一个文件)。应该小心 在安全敏感的应用程序中使用此方法时。
示例:
File file = new File("/path/to/file");
Files.isReadable(file.toPath()); // true if `/path/to/file` is readable
答案 3 :(得分:4)
如果您要阅读它,您只需要知道它是否可读。因此,只需在需要时尝试阅读,如果不能,请尝试处理。测试任何资源可用性的最佳方法是尝试使用它并处理出现的异常或错误。不要试图预测未来。
答案 4 :(得分:0)
检查资源的可访问性(在这种情况下为文件的可读性)早于该资源的实际使用是完全合理的。
想象一个服务器应用程序将使用子组件,该子组件在某些情况下会在一段时间后读取特定文件。在服务器启动时检查文件的可读性并警告(如果无法读取)很有用。这样,在情况实际导致子组件尝试读取该文件之前,有人可以解决该情况(使文件可读)。
当然,这种前期检查不能替代子组件中的适当异常处理(很有可能文件在开始时就可读,但在以后变得不可读)。
所以我认为关于预检查的问题是完全正确的。
对于检查资源的方法,请尝试做与实际使用尽可能类似的事情。如果以后会读取该文件,请尝试读取它!
对于Files.isReadable(...):不能保证Files.isReadable(...)下的文件系统提供程序不是错误的。它可以返回true,然后在实际读取文件的情况下引发异常。
当然,如果您正在编写文件管理器应用程序,请使用Files.isReadable(...),但我想事实并非如此。