gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 12:42:44 25 4
gpt4 key购买 nike

我是这个小组的新人。请建议如何返回 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目录或结尾的非隐藏文件

然后,它对生成的文件列表进行排序,以便"file"首先出现,“目录”或排序到底部,这是一个挑剔的选择,但要确保列表中文件的特定顺序。

然后它处理文件列表,将"file"添加到列表中,并递归扫描“目录”,将结果添加到列表中...

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

举个例子...

关于java - 添加所有文件后如何返回 File[] 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24948371/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com