如何在向其添加所有文件后返回File []数组

时间:2014-07-25 05:00:34

标签: java arrays

我是这个小组的新手。当我尝试添加来自" D:\"的所有文本文件时,请建议如何返回File[]数组,因为我的代码正在提供NullPointerExceptionFile[]数组,因为我想将所有文本文件作为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
}

4 个答案:

答案 0 :(得分:1)

您遇到的主要问题是在使用之前未初始化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()]);
}

作为一个例子......

答案 1 :(得分:0)

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

即可
File[] list = source.listFiles(filter);

// initialize here because we know the size now.
allFiles = new File[list.length];

答案 2 :(得分:0)

定义File[] allFiles,喜欢 -

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

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

初始化 -

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

添加元素 -

allFiles.add(f);

答案 3 :(得分:0)

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());
}