我试图递归搜索目录并列出所有找到的.txt文件。这是我的代码:
private static void listFilesForFolder(File folder) throws FileNotFoundException {
for (final File fileEntry : folder.listFiles()) {
if (fileEntry.isDirectory()) {
listFilesForFolder(fileEntry);
} else {
System.out.println(Arrays.toString(fileEntry.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
return pathname.getName().endsWith(".txt");
}
})));
}
}
}
我正在使用FileFilter打印所有.txt文件,但它打印的是null。有人知道为什么会这样吗?
答案 0 :(得分:0)
我认为您可以使用FileFilter
语句来代替在else
块中使用if
。因为在此else
块中,您始终有一个文件(而不是目录)。看看下面的更改是否对您有用。
private static void listFilesForFolder(File folder) throws FileNotFoundException
{
for (final File fileEntry : folder.listFiles()) {
if (fileEntry.isDirectory()) {
listFilesForFolder(fileEntry);
} else {
if (fileEntry.getPath().toLowerCase().endsWith(".txt")) {
System.out.println(fileEntry.getPath());
}
/*System.out.println(Arrays.toString(fileEntry.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
return pathname.getName().endsWith(".txt");
}
})));*/
}
}
}
编辑:
如果您确实想使用FileFilter
进行此操作,则可以这样做:
private static void listFilesForFolder2(File folder) throws FileNotFoundException
{
File[] textFiles = folder.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
return pathname.isFile() && pathname.getName().toLowerCase().endsWith(".txt");
}
});
if (textFiles != null) {
for (File f : textFiles) {
System.out.println(f.getPath());
}
}
for (final File fileEntry : folder.listFiles()) {
if (fileEntry.isDirectory()) {
listFilesForFolder2(fileEntry);
}
}
}
答案 1 :(得分:0)
仅当file.listFiles()
对象是String[]
对象时,方法file
返回Directory
,如果file
是File
对象,则方法for (final File fileEntry : folder.listFiles()) {
if (fileEntry.isDirectory()) {
listFilesForFolder(fileEntry);
} else {
if (fileEntry.getName().endsWith(".txt")) {
System.out.println(fileEntry.getName());
}
}
}
返回null。您可以像这样修改您的代码:
IOFileFilter
如果您可以使用apache commons-io,则很容易使用 FileUtils.listFiles(folder, new IOFileFilter() {
@Override
public boolean accept(File file) {
return file.getName().endsWith(".txt");
}
@Override
public boolean accept(File file, String s) {
return true;
}
}, new IOFileFilter() {
@Override
public boolean accept(File file) {
return true;
}
@Override
public boolean accept(File file, String s) {
return true;
}
}).stream().forEach(file -> System.out.println(file.getName()));
来过滤所需的内容:
[redis]