在Java中搜索根驱动器中的文件

时间:2017-02-12 10:36:51

标签: java

我的问题不是空指针异常。 我的问题是为什么在C中进行文件搜索时:我得到了零点异常,即使我可以列出内容。 我做了一个类来搜索文件。 如果我在目录中搜索,一切正常。 但是如果我在像c或d这样的驱动器中搜索,我会得到一个nullpointer异常。 我该如何解决这个问题?

这里是代码:

import java.io.File;
import java.util.ArrayList;

/**
 * Created by Marcwe on 12/02/2017.
 */
public class FileSearch {

    ArrayList<String> listOfResult = new ArrayList<>(10);

    public FileSearch(File searchPath, String theFile) {
        ArrayList<String> oneList = new ArrayList<>(10);
        listOfResult = searchTheFile(theFile, searchPath, oneList);
        for (String x : listOfResult) {
            System.out.println(x);

        }
    };

    public ArrayList<String> searchTheFile(String theFileToSearch, File inThePath, ArrayList<String> aList) {
        File pathToSearch = inThePath;
        if (!(inThePath == null)) {
            for (File item : pathToSearch.listFiles()) {
                if (!(item == null) && !(item.isFile())) {
                    System.out.println(item.getAbsolutePath());
                    aList = (searchTheFile(theFileToSearch, item, aList));
                } else {
                    if (!(item == null)) {
                        if (item.getName().equalsIgnoreCase(theFileToSearch)) {
                            aList.add(item.getAbsolutePath());
                        }
                    }
                }
            }
        }
        return aList;
    }

    public static void main(String[] args) {
        FileSearch searchTest = new FileSearch(new File("C:/"), "test.txt");
    }
}

1 个答案:

答案 0 :(得分:1)

FileSearch searchTest = new FileSearch(new File("C:/"), "test.txt");

在此处浏览所有磁盘以查找文件 可能是

列出的某些文件夹或文件
    for (File item : pathToSearch.listFiles()) {

以递归方式调用无法使用Java File API列出 我认为您可能会遇到虚拟或隐藏文件夹的问题 Javadoc指示如果此抽象路径名(此处为pathToSearch变量)不表示目录,或者发生I / O错误,则它可能返回null。由于文件系统可能具有许多特殊性,因此它相当宽泛并且javadoc无法引用它们。

此外,您可能会错过列出某些文件夹或文件的权利。哪个可能会上升SecurityException

这是Javadoc关于File[] java.io.File.listFiles()的回复:

返回:

  

表示文件和目录的抽象路径名数组   此抽象路径名表示的目录。阵列将是   如果目录为空则为空。如果此抽象返回null   pathname不表示目录,或者发生I / O错误。   抛出:SecurityException - 如果存在安全管理器及其   SecurityManager.checkRead(String)方法拒绝对。的读访问   目录自:   1.2

所以我想你不应该在foreach中直接调用listFiles()因为null值会产生NullPointerException

for (File item : pathToSearch.listFiles()) {

您应该调用listFiles()来检索File数组并仅在不是null的情况下执行循环:

File[] files = pathToSearch.listFiles();
if (files != null){
  for (File item : files) {
   ...
   }
}

此外,您应该捕获SecurityException,因为文件夹或文件可能缺少权限,以避免在运行时出现意外异常,从而阻止搜索完成。

最后,您可以通过应用失败快速原则来降低方法的嵌套级别:您尽快处理失败的情况。
当你使用递归时,你应该非常直接地阅读这个方法。

public ArrayList<String> searchTheFile(String theFileToSearch, File inThePath, ArrayList<String> aList) {

    File pathToSearch = inThePath;

    if (inThePath != null)) {

        // fail fast cases
        File[] files = null;
        try {
            files = pathToSearch.listFiles();
        } catch (SecurityException e) {
            return aList;
        }

        if (files == null) {
            return aList;
        }

        // nominal case
        for (File item : files) {
          ...
        }