如何将所有文件添加到File[]数组后返回



我是新来的。请建议如何返回File[]数组,因为我下面的代码是在我试图将所有文本文件从"D:"添加到File[]数组时给出NullPointerException,因为我想将所有文本文件返回为File[]数组,这将在另一种方法中用于读取所有文本文件。

File[] allFiles;
int i = 0;
public File[] findFiles(File source) {
    FileFilter filter = new FileFilter() {
        @Override
        public boolean accept(File pathname) {
            // TODO Auto-generated method stub
            if (!pathname.isHidden()) {
                return true;
            }
            return false;
        }
    };
    File[] list = source.listFiles(filter);
    if (list != null) {
        for (File f : list) {
            if (f.isDirectory()) {
                findFiles(f);
            }
            if (f.getName().contains("txt")) {
                System.out.println(f.getAbsolutePath());
                allFiles[i] = f; // it is giving nullpointerexception
                i++;
            }
        }
    }
    return allFiles; // want to return this to another method
}

您遇到的主要问题是您在使用它之前没有初始化allFiles

File[] list = source.listFiles(filter);
if (list != null) {
    for (File f : list) {
            //...
            // still null
            allFiles[i] = f; // it is giving nullpointerexception

您可以使用allFiles = new File[list.length],但这里的问题是您可能最终在列表中使用null元素,因为您正在过滤掉元素…

相反,你可以使用你的FileFilter,这就是它的作用…例如…

public File[] findFiles(File source) {
    FileFilter filter = new FileFilter() {
        @Override
        public boolean accept(File pathname) {
            return !pathname.isHidden() && 
                   pathname.getName().toLowerCase().endsWith(".txt");
        }
    };
    File[] list = source.listFiles(filter);
    return list;
}

基本上,它的作用是检查文件是否未被隐藏,以及其名称是否以.txt结尾,例如…

因为你在做递归查找,你真的需要一些方法来添加新文件到你的数组,并动态地增长它。

虽然您可以使用普通的旧数组来完成此操作,但某种List将更容易,例如…

下面使用FileFilter查找目录或以.txt

结尾的所有非隐藏文件

然后对结果文件列表进行排序,以便"文件"首先出现,"目录"或排序到底部,这是一个小选择,但确保列表中文件的特定顺序。

然后处理文件列表,将"文件"添加到List并递归扫描"目录",将结果添加到List

public static File[] findFiles(File source) {
    FileFilter filter = new FileFilter() {
        @Override
        public boolean accept(File pathname) {
            return !pathname.isHidden() && 
                    (pathname.isDirectory() || 
                    pathname.getName().toLowerCase().endsWith(".txt"));
        }
    };
    File[] files = source.listFiles(filter);
    Arrays.sort(files, new Comparator<File>() {
        @Override
        public int compare(File o1, File o2) {
            int compare = 0;
            if (o1.isDirectory() && o2.isDirectory()) {
                compare = 0;
            } else if (o1.isFile()) {
                compare = -1;
            } else {
                compare = 1;
            }
            return compare;
        }
    });
    List<File> fileList = new ArrayList<>(25);
    for (File file : files) {
        if (file.isFile()) {
            fileList.add(file);
        } else {
            fileList.addAll(Arrays.asList(findFiles(file)));
        }
    }
    return fileList.toArray(new File[fileList.size()]);
}

非常简单,只需初始化allFiles数组

File[] list = source.listFiles(filter);
// initialize here because we know the size now.
allFiles = new File[list.length];

定义File[] allFiles,Like -

File[] allFiles = new File[list.length];

或者你可以使用List代替Array,这是一个动态数组(不固定大小)。

初始化——

List<File> allFiles = new ArrayList<File>();

添加元素-

allFiles.add(f);
FileFilter filter = new FileFilter() {
@Override
public boolean accept(File pathname) {
  return !pathname.isHidden() &&  
         pathname.getName().toLowerCase().endsWith(".txt");
    }
};
File[] files = f.listFiles(filter);
for (File file : files) {
    if (file.isDirectory()) {
        System.out.print("is a directory");
    } else {
        System.out.print("is a file");
    }
    System.out.println(file.getCanonicalPath());
}

最新更新