我想通过提供文件名来搜索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)
对此有何建议?
答案 0 :(得分:1)
您可以使用Java中的FileVisitor
,然后使用Files.walkFileTree(startDir, visitor)
从起始目录递归地遍历文件树。
FileVisitor
定义了为每个文件/目录调用的几种方法(请参阅here)。
特别感兴趣的是方法
FileVisitResult visitFile(T file, BasicFileAttributes attrs)
为每个文件调用。在此方法中,您可以检查它是否是您要搜索的文件。
(如果您不需要其他方法,请使用SimpleFileVisitor
并覆盖visitFile()
方法。
有关如何使用它的完整说明,请参阅Walking the File Tree。
答案 1 :(得分:0)
您直接在文件对象上调用listFiles()
方法。如果文件不是目录,则返回null,这就是您获取 NPE 的原因。所以验证第一个文件是dierctory与否,然后调用该方法
根据{{3}}
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);
}
}
答案 2 :(得分:0)
如果您要打开的所有文件确实存在,您可以签入parseAllFiles()
:
File fileInDirectory = new File(parentDirectory);
if(fileInDirectory.exists()){
File[] filesInDirectory = fileInDirectory.listFiles();
}
然后你就可以意识到还没有找到/创建了什么文件。
你可以在第一个循环中做同样的事情:
for(File f : files){
if(f.exists())
parseAllFiles(f.getPath());
}
答案 3 :(得分: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);
}
}
}