File.isFile()和File.isDirectory()都返回false



我有一个名为"aaaäaa.xls"的文件

为此,File.isFile()File.isDirectory()正在返回false?为什么在Linux中返回false

请尝试以下代码示例

if(!pFile.exists()){
   throw new FileNotFoundException();
}
boolean isDir = pFile.isDirectory();
boolean isFile = pfile.isFile();

该文件不是文件

如果它不是一个目录,并且满足其他依赖于系统的标准

如果抛出异常,则必须检查文件路径。

根据文档:

公共布尔值isFile()

退货:true当且仅当由该抽象路径名表示的文件存在并且正常文件;否则为false。

在此基础上,您的文件要么不存在,要么不是普通文件。

第一次可能的原因:

  1. 文件不存在
  2. 文件无法访问
  3. 文件名键入错误
  4. 程序中使用的字符编码不是与创建文件时使用的相同

第二次可能的原因:

  • 这不是一个常规文件

或者是JVM中的一个错误。这也是可能的,尽管可能性不大。例如,有一次我遇到了路径名中的感叹号问题——Bug 4523159。

如果您想以任何方式访问该文件,请考虑调用dir.listFiles()并使用其返回值。


(答案部分基于此线程)

检查此文件的父目录的权限。其中一些目录可能没有当前用户的执行权限。

  • 目录的执行位允许受影响的用户输入它并访问其中的文件和目录

我知道这个问题是五年前问的,事实上,我之所以回答这个问题,是因为我遇到了同样的问题,我正在创建一个给定路径中所有文件的列表,如下所示:

File files = Paths.get(path).toFile();      
List<String> filenames = Arrays.asList(files.list());

问题是,路径包含一个名为testing_testing的目录,该目录将作为列表的一部分返回。

然后当我做以下测试时:

for (String filename : filenames) {
    if (Files.isDirectory(Paths.get(filename))) {
        System.out.println(filename + " is a directory.");
    } else {
        if(filename.equals("testing_testing")) {
            System.out.println("Is this a directory?: " + Files.isDirectory(Paths.get(filename)));
            System.out.println("Does the file exists?: " + Files.exists(Paths.get(filename)));
            System.out.println("Is this a regular file?: " + Files.isRegularFile(Paths.get(filename)));
            System.out.println("Is this a symbolic link?: " + Files.isSymbolicLink(Paths.get(filename)));                       
        }                   
    }
}

对于Files.isDirectory()Files.exists(),返回false。

经过一段时间的摸索,我注意到我只得到了文件名,而没有它们的完整路径,这意味着我只将testing_testing传递给Paths.get(),而不是传递它的完整路径。这就是为什么它不存在,并且在两种情况下都返回false。

我把代码改成:

Paths.get("C:test", filename);

现在测试返回正确的值。我不知道你是否已经想明白了,因为你已经五年没有问了。但对于有同样问题的人,请确保您传递的文件路径正确,然后尝试以前对同一问题的回答中建议的其他方法。

我也遇到过file.isFile()在文件上返回false的问题,可能是因为该文件不是"规则的",正如对该问题的其他回答中所指出的那样。作为一种变通方法,我使用file.listFiles() != null,它似乎提供了我需要的功能。根据Java文件API:

如果这个抽象路径名不表示目录,那么这个方法返回null。否则将返回一个File对象数组。

我在.txt文件上测试isFile()时也遇到了同样的错误。问题是我创建的文件名中有something.txt.txt。然后我将something.txt重命名为something

我真的对自己很生气

Java在您的案例中使用的字符编码与源文件中的字符编码不同,因此符号"ä"中的文件名无法由Java正确解码,导致文件名不同。这就是Java找不到该文件的原因。因此,对该文件的操作函数返回"0";错误";。

作为在不同构建环境中正确工作的最安全方法,为了避免设置Java字符编码选项,并使处理源文件更容易,请在源代码中仅使用US-ASCII(7位)字符。至于其他字符,请使用它们的Unicode编号,例如,而不是";ä"使用";\u00e4";。因此,您的文件名将变为";aaa\u00e4aa.xls";。

我已经遇到过好几次这个问题,如果一切都尝试过了,那么可能是路径问题。任何空格字符都会被%20替换,这会导致问题。

因此,尽管这不起作用:

File file = new File(Objects.requireNonNull(getClass().getResource(/path/to/file).getPath());

事实上:

File file = new File(Objects.requireNonNull(getClass().getResource(/path/to/file).getPath().replace("%20", " "));

相关内容

  • 没有找到相关文章

最新更新