如何检查文件是否可读?

pet*_*ter 8 java java-native-interface winapi jna

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

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

Rom*_*n C 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;
}
Run Code Online (Sandbox Code Playgroud)

  • 这里存在和可读性检查只是冗余开销.当你试图打开文件时,显然它们必须发生:没有必要做两次这样的事情. (6认同)

ale*_*oot 5

你可以用这种方式使用FilePermissionAccessController更强硬:

FilePermission fp = new FilePermission("file.txt", "read");
AccessController.checkPermission(fp);
Run Code Online (Sandbox Code Playgroud)

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

  • 这不会检查文件是否可读.它检查当前正在执行的Java代码是否具有.policy文件条目,该条目允许Java安全管理器授予*attempt*读取文件的权限:如果没有安装安全管理器,它将始终成功,这可能是这里的情况.操作系统是否允许开放是完全独立的事情.不是答案. (7认同)

sva*_*rog 5

Java 7引入了Files.isReadablestatic方法,它接受一个文件Path,如果文件存在并且可读,则返回true,否则返回false。

来自文档

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

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

例:

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

  • +1清楚地表明答案是立即无用的。对于任何想做这样的事情的人,就像所有其他“我需要在读取文件之前先检查是否可以读取文件”的答案一样,[此答案是TOCTOU错误](https://en.wikipedia.org / wiki / Time_of_check_to_time_of_use)。 (3认同)