我是新来的。请建议如何返回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());
}