0

我想通过提供文件名来在 Windows 中搜索文件,最初我尝试使用这段代码列出所有文件

File[] files = File.listRoots();   
for(File f : files){   
  parseAllFiles(f.getPath());   
}   


...

public static void parseAllFiles(String parentDirectory){   
  File[] filesInDirectory = new File(parentDirectory).listFiles();   
  for(File f : filesInDirectory){   
    if(f.isDirectory()){   
      parseAllFiles(f.getAbsolutePath());   
    }   
    System.out.println("Current File -> " + f);             
  }     
}

但我有一个例外说

Exception in thread "main" java.lang.NullPointerException
    at fileoper.parseAllFiles(fileoper.java:24)
    at fileoper.parseAllFiles(fileoper.java:26)
    at fileoper.parseAllFiles(fileoper.java:26)
    at fileoper.main(fileoper.java:19)

对此有何建议?

4

4 回答 4

1

您可以使用FileVisitorJava 中的 ,然后Files.walkFileTree(startDir, visitor)从起始目录递归地遍历文件树。

FileVisitor定义了为每个文件/目录调用的几个方法(请参见此处)。特别感兴趣的是方法

FileVisitResult visitFile(T file, BasicFileAttributes attrs)

每个文件都调用它。在这种方法中,您可以检查它是否是您正在搜索的文件。

(如果您不需要其他方法,请SimpleFileVisitor仅使用并覆盖该方法)visitFile()

有关如何使用它的完整描述,请参阅遍历文件树。

于 2013-08-05T08:17:17.950 回答
0

listFiles()直接在文件对象上调用方法。如果文件不是目录,则返回 null,这就是您获得NPE的原因。因此请验证第一个文件是否为 dirctory,然后调用该方法。
根据文件#listFiles()

pathname 不表示目录,则此方法返回 null。否则返回一个 File 对象数组

这是要修改的代码

public static void parseAllFiles(String parentDirectory)
{        
          File file =  new File(parentDirectory);
          if(file.isDirectory())
         {
           File[] filesInDirectory =listFiles();   
           for(File f : filesInDirectory)
           {    
                    parseAllFiles(f.getAbsolutePath());   
            }   

          }else{
               System.out.println("Current File -> " + file);                  
          }

}

于 2013-08-05T08:10:13.040 回答
0

您可以通过以下方式检查parseAllFiles()您要打开的所有文件是否实际存在:

File fileInDirectory = new File(parentDirectory);
  if(fileInDirectory.exists()){
  File[] filesInDirectory = fileInDirectory.listFiles();
} 

然后您可以意识到尚未找到/创建什么文件。

您可以在第一个循环中执行相同的操作:

for(File f : files){  
  if(f.exists()) 
  parseAllFiles(f.getPath());   
}   
于 2013-08-05T08:12:47.663 回答
0

我试过你的例子。尝试打开时得到一个空指针/root。当我尝试通过终端打开它时,它只是说我没有权限。

所以你基本上有权限问题。

javadoc 说:

̀Returns null if this abstract pathname does not denote a directory, or if an I/O error occurs.

为了捕捉到这一点,您应该检查是否filesInDirectory为空。

public static void parseAllFiles(String parentDirectory){   
  File[] filesInDirectory = new File(parentDirectory).listFiles();
  //Added this line.
  if(filesInDirectory != null){   
    for(File f : filesInDirectory){   
      if(f.isDirectory()){   
        parseAllFiles(f.getAbsolutePath());   
      }   
      System.out.println("Current File -> " + f);             
    }
  }
}
于 2013-08-05T08:16:55.003 回答