我想获取目录中具有特定扩展名的文件列表。在 API (Java 6) 中,我看到一个方法
File.listFiles(FileFilter)
可以执行此操作。
由于我需要特定的扩展,所以我创建了一个
FileNameExtensionFilter
。但是,当我使用 listFiles
时,会出现编译错误。我认为既然FileNameExtensionFilter implements FileFilter
,我应该能够做到这一点。代码如下:
FileNameExtensionFilter filter = new FileNameExtensionFilter("text only","txt");
String dir = "/users/blah/dirname";
File f[] = (new File(dir)).listFiles(filter);
最后一行显示编译错误:
File 类型中的方法 listFiles(FileNameFilter) 不适用于 FileNameExtensionFilter 类型的参数
我正在尝试使用
listFiles(FileFilter)
,而不是listFiles(FileNameFilter)
。为什么编译器不识别这个?
如果我编写自己的扩展过滤器来扩展
FileFilter
,这将有效。我宁愿使用 FileNameExtensionFilter
而不是自己编写。我做错了什么?
FileNameExtensionFilter
类旨在让Swing在JFileChooser
中使用。
FilenameFilter
代替。例如:
File dir = new File("/users/blah/dirname");
File[] files = dir.listFiles(new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.toLowerCase().endsWith(".txt");
}
});
java 8 语法中的单行:
pdfTestDir.listFiles((dir, name) -> name.toLowerCase().endsWith(".txt"));
您想使用
FileNameExtensionFilter
有什么具体原因吗?我知道这有效..
private File[] getNewTextFiles() {
return dir.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.toLowerCase().endsWith(".txt");
}
});
}
使用 java lambdas(自 java 8 起可用),您可以简单地将
javax.swing.filechooser.FileFilter
转换为 java.io.FileFilter
在一行中。
javax.swing.filechooser.FileFilter swingFilter = new FileNameExtensionFilter("jpeg files", "jpeg");
java.io.FileFilter ioFilter = file -> swingFilter.accept(file);
new File("myDirectory").listFiles(ioFilter);
这是我刚刚快速制作的东西,它的性能应该比 File.getName().endsWith(".xxxx"); 好得多
import java.io.File;
import java.io.FileFilter;
public class ExtensionsFilter implements FileFilter
{
private char[][] extensions;
private ExtensionsFilter(String[] extensions)
{
int length = extensions.length;
this.extensions = new char[length][];
for (String s : extensions)
{
this.extensions[--length] = s.toCharArray();
}
}
@Override
public boolean accept(File file)
{
char[] path = file.getPath().toCharArray();
for (char[] extension : extensions)
{
if (extension.length > path.length)
{
continue;
}
int pStart = path.length - 1;
int eStart = extension.length - 1;
boolean success = true;
for (int i = 0; i <= eStart; i++)
{
if ((path[pStart - i] | 0x20) != (extension[eStart - i] | 0x20))
{
success = false;
break;
}
}
if (success)
return true;
}
return false;
}
}
这是各种图像格式的示例。
private static final ExtensionsFilter IMAGE_FILTER =
new ExtensionsFilter(new String[] {".png", ".jpg", ".bmp"});
呃....listFiles 需要java.io.FileFilter。 FileNameExtensionFilter 扩展了 javax.swing.filechooser.FileFilter。我通过实现 java.io.FileFilter
的实例解决了我的问题编辑:我确实使用了类似于@cFreiner 的答案。我试图使用 Java API 方法而不是编写自己的实现,这就是我尝试使用 FileNameExtensionFilter 的原因。我的应用程序中有许多 FileChoosers,并为此使用了 FileNameExtensionFilters,并且我错误地认为它也在扩展 java.io.FileFilter。
还有 DirectoryStream
import java.nio.file.DirectoryStream;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.io.IOException;
//import java.io.File;
Path path = Paths.get("foo/whereever");
// or if you still have a File-Object 'f':
// Path path = f.toPath();
try{
Files.newDirectoryStream(path, "*.txt").forEach(System.out::println);
}catch(IOException e){}
或者如果想做一些更复杂的事情
...
try (DirectoryStream<Path> stream = Files.newDirectoryStream(path, "*.txt"))
for (Path entry: stream) {
System.out.println(entry);
//do something with entry
}
}catch(Exception e){
e.printStackTrace();
}