【问题标题】:how to search for a file in windows using java如何使用java在windows中搜索文件
【发布时间】:2013-08-05 08:03:07
【问题描述】:

我想通过给出文件名来在 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)

对此有何建议?

【问题讨论】:

  • 您可能没有权限列出根目录中的文件。在这种情况下,File#listFiles 返回null
  • 是的,您是正确的,感谢您提供的信息

标签: java file-io io fileutils


【解决方案1】:

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

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

FileVisitResult visitFile(T file, BasicFileAttributes attrs)

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

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

有关如何使用它的完整说明,请参阅Walking the File Tree

【讨论】:

    【解决方案2】:

    我试过你的例子。尝试打开 /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);             
        }
      }
    }
    

    【讨论】:

      【解决方案3】:

      你在文件对象上直接调用listFiles() 方法。如果文件不是目录,它返回 null,这就是你得到NPE的原因。所以验证第一个文件是否是错误然后调用该方法。
      根据File#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);                  
                }
      

      }

      【讨论】:

        【解决方案4】:

        如果您要打开的所有文件实际上都存在,您可以通过以下方式签入parseAllFiles()

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

        然后你就可以意识到什么文件没有被找到/创建。

        你可以在第一个循环中做同样的事情:

        for(File f : files){  
          if(f.exists()) 
          parseAllFiles(f.getPath());   
        }   
        

        【讨论】:

          猜你喜欢
          • 2012-12-04
          • 2022-11-17
          • 2010-10-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-04-05
          • 2011-12-27
          相关资源
          最近更新 更多