8

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

但是,还有另一个问题,因为在 WINAPI 中很难找到一个简单的函数来返回有关访问文件的信息。我发现GetNamedSecurityInfo或者GetSecurityInfo但我不是高级 WINAPI 程序员,而且它们对于我来说与 JNA/JNI 连接起来太复杂了。任何想法如何处理这个问题?

4

5 回答 5

9

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
于 2018-02-17T14:44:12.940 回答
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;
}
于 2012-08-10T12:50:41.977 回答
6

您可以通过这种方式更严格地使用FilePermissionAccessController

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

如果请求的访问被允许,checkPermission 会安静地返回。如果被拒绝,则会引发 AccessControlException。

于 2012-08-10T12:51:01.147 回答
4

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

于 2012-08-11T03:12:06.613 回答
1

在资源的实际使用之前很久检查资源的可访问性(在这种情况下是文件的可读性)是完全合理的。

想象一个服务器应用程序将使用一个子组件,该子组件将在一段时间后在某些情况下读取特定文件。在服务器启动时检查文件的可读性并在不可读时发出警告可能很有用。然后有人可以在情况实际导致子组件尝试读取该文件之前解决这种情况(使文件可读,任何东西)。

当然,这种预先检查并不能替代子组件中正确的异常处理(文件很可能在开始时是可读的,但后来变得不可读)。

所以我认为关于预检查的问题是完全有效的。

至于检查资源的方法,尽量做与实际使用情况类似的事情。如果稍后将读取该文件,请尝试读取它!

至于 Files.isReadable(...):不能保证 Files.isReadable(...) 下面的文件系统提供程序没有错误。它可以返回true,如果实际读取了文件,则抛出异常。

当然,如果您正在编写一个文件管理器应用程序,那么使用 Files.isReadable(...),但我想情况并非如此。

于 2018-11-09T10:44:51.283 回答