您的位置:首页 > 其它

File 的实例方法 list()

2019-04-26 20:52 106 查看
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_39291919/article/details/89576323

File 的实例方法 list() 有两个重载方法。

  • public String[] list()

无参方法,能够以 String[] 形式返回一个目录下的所有文件或文件夹的名字;如果 File 是文件,则返回 null。

用法:

[code]File dir = new File("E:" + File.separator);
String[] list = dir.list();
  • public String[] list(FilenameFilter filter)

有参方法,FilenameFilter 是 java.io 下的一个接口,只有一个方法:

[code]public interface FilenameFilter {
boolean accept(File dir, String name);
}

这个方法被用在该 public String[] list(FilenameFilter filter) 方法内:

[code]public String[] list(FilenameFilter filter) {
String names[] = list();
if ((names == null) || (filter == null)) {
return names;
}
List<String> v = new ArrayList<>();
for (int i = 0 ; i < names.length ; i++) {
if (filter.accept(this, names[i])) {
v.add(names[i]);
}
}
return v.toArray(new String[v.size()]);
}

其中,注意到:accept 返回 true,则执行 add 操作;否则,不执行。因此,accept 方法的返回值决定了是否添加文件名。

观察:

[code]public static void main(String[] args) {
File dir = new File("E:" + File.separator);
String[] list = dir.list(filter("*.java"));
System.out.println(Arrays.toString(list));
}

public static FilenameFilter filter(final String regex) {
return new FilenameFilter() {
private Pattern pattern = Pattern.compile(regex);
@Override
public boolean accept(File dir, String name) {
return pattern.matcher(name).matches();
}
};
}

ps:首先创建了一个 filter() 方法,它会返回一个指向 FilenameFilter 的引用,方法内部通过构造匿名类进行返回。其中匿名类负责提供 accpet() 方法,使 list() 可以回调 accpet(),进而以决定哪些文件包含在列表中。这种结构也常常称为回调。更具体地说,这是一个策略模式的例子,因为 list() 实现了基本的功能,而且按照 FilenameFilter 的形式提供了这个策略,以便完善 list() 在提供服务时所需的算法。

然而,可以进一步修改这个方法,定义一个作为 list() 参数的匿名类,这样程序会更小:

[code]public static void main(String[] args) {
File dir = new File("E:" + File.separator);
/* 假装 regex 是从用户输入接收的 */
final String regex = "*.java";
String[] list = dir.list(new FilenameFilter() {
private Pattern pattern = Pattern.compile(regex);
@Override
public boolean accept(File dir, String name) {
return pattern.matcher(name).matches();
}
});
System.out.println(Arrays.toString(list));
}

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: