我一直在寻找一种方法来获取当前目录中以.txt结尾的所有文件。我在这里找到了如何做到这一点的答案https://stackoverflow.com/a/5751357/3972558并且它有效。现在我正在审查我自己的代码,我仍然不太明白这是如何工作的,我正试图从中学习。
File workingDirectory = new File(System.getProperty("user.dir"));
File[] files = workingDirectory.listFiles(new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.toLowerCase().endsWith(".txt");
}
});
如何在通常可以找到参数输入的地方声明方法?我可能以错误的方式提出我的问题,因为我不明白为什么这种语法是正确的。
具体来说,这是如何正确输入listFiles()
:
new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.toLowerCase().endsWith(".txt");
}
}
更新:我现在看到你确实正在为FileNameFilter
接口实现accept方法。如何在关键字new
之后实现它是如何实现的。
http://docs.oracle.com/javase/7/docs/api/java/io/File.html http://docs.oracle.com/javase/7/docs/api/java/io/FileFilter.html
答案 0 :(得分:2)
Ok FilenameFilter
是一个抽象类,使用抽象方法accept()
。您必须实现此功能以及所有其他内容(例如,比较每个文件名),将由FilenameFilter
完成。您必须在new
之后实现它,因为要创建新的过滤器,Java必须知道您希望FilenameFilter
能够工作。
java的基本思想是使一些方法抽象化,你必须在说明你想要在你的特殊情况下做什么的方式实现它。我希望它能让它更清晰一点!
答案 1 :(得分:1)
您没有声明方法。这是一个作为参数的类。它是一个抽象类,您提供了一个匿名类实现。
答案 2 :(得分:1)
File::listFiles(FilenameFilter filter)
将FilenameFilter
作为参数
您可以通过经典方式创建自己的FilenameFilter
:
public class MyFilter extends FilenameFilter {
public boolean accept(File dir, String name) {
return name.toLowerCase().endsWith(".txt");
}
}
然后像workingDirectory.listFiles(new MyFilter());
一样使用它
但为方便起见,我们经常使用匿名类机制来避免编写这么小的类。
例如,这是一个使用匿名类的小片段。
public class Duck {
public String couak() {
return "couak couak";
}
}
public static void main(String[] args) {
Duck englishDuck = new Duck();
// In the next line, we create a Duck and override the couak() method
Duck frenchDuck = new Duck() {
@Override
public String couak() {
return "coin coin";
}
};
System.out.println(englishDuck.couak());
System.out.println(frenchDuck.couak());
}
答案 3 :(得分:1)
我希望您在目录中过滤文件的问题已得到解决,您的问题与此代码的工作原理直接相关。这只是匿名类的一个例子。你在here上了解了更多相关信息。这篇文章的摘要是;
匿名类使您可以使代码更简洁。他们 使您能够同时声明和实例化一个类。他们 就像当地的班级,除了他们没有名字。使用它们 如果你只需要使用一次本地课程。
当你想要只实现一次类时,这非常方便,例如,如果你必须在多个地方使用你的过滤器,你将创建一个实现FilenameFilter的类,如下所示;
public class TxtFileFilter implements FilenameFilter {
@Override
public boolean accept(File arg0, String arg1) {
return arg1.toLowerCase().endsWith(".txt");
}
}
并像在不同的地方一样使用它
File[] files = workingDirectory.listFiles(new TxtFileFilter());
我希望这会有所帮助。快乐编码:)