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