如何使用java在Windows中搜索文件

时间:2013-08-05 08:03:07

标签: java file-io io fileutils

我想通过提供文件名来搜索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 个答案:

答案 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);             
    }
  }
}