0
点赞
收藏
分享

微信扫一扫

File操作 - list()/listFiles()与目录过滤器

【1】list()方法

会返回一个字符数组,将制定路径下的文件或文件夹名字存储到String数组中。因为其返回的是一个String类型的数组,所以它也就只是一个名字而已(后面要讲到的listFiles()及其重载方法则不同,它们返回的是File类型的对象,所以具有其全部的属性和方法)。

有以下两种重载方式:

  • String[] list()
  • String[] list(FilenameFilter filter)

① String[] list(FilenameFilter filter)

FilenameFilter filter是一个目录过滤器,是一个接口。list(FilenameFilter filter)方法会选择符合条件的文件或文件夹。

源码如下:

public String[] list(FilenameFilter filter) {
String names[] = list();
if ((names == null) || (filter == null)) {
return names;
}
ArrayList v = new ArrayList();
for (int i = 0 ; i < names.length ; i++) {
/*通过accept方法判断,this指调用list的对象。。*/
if (filter.accept(this, names[i])) {
v.add(names[i]);
}
}
return (String[])(v.toArray(new String[v.size()]));
}

可知,list(FilenameFilter filter)方法保存的是那些能够使filter.accept()方法返回true的文件名。

使用时候需要重写accept方法

public interface FilenameFilter {
/**
* Tests if a specified file should be included in a file list.
*
* @param dir the directory in which the file was found.
* @param name the name of the file.
* @return <code>true</code> if and only if the name should be
* included in the file list; <code>false</code> otherwise.
*/
boolean accept(File dir, String name);
}

1,实现FilenameFilter 接口

class FileNameFilter1 implements FilenameFilter{
private Pattern pattern;

/*传入正则表达式*/
public FileNameFilter1(String regex) {
pattern = Pattern.compile(regex);
}

@Override
public boolean accept(File dir, String name) {
boolean result = pattern.matcher(name).matches();
return result;
}
}

2,采用匿名内部类的方式

class FileNameFilter2{
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();
}
};
}
}

test

@Test
public void test2(){
System.out.println("------挑选当前目录下以.开头的文件或文件夹-------");
//1、挑选当前目录下以.开头的文件或文件夹,并且打印出来(创建一个类来实现FilenameFilter接口)
File path = new File("./");
String[] nameList = path.list(new FileNameFilter1("\\..*"));
for(String itemName : nameList){
System.out.println(itemName);
}

System.out.println("------挑选上级目录下以b开头的文件或文件夹-------");
//2、挑选上级目录下以b开头的文件或文件夹,并且打印出来(使用匿名内部类的方式来实现)
File path2 = new File("../");
String[] nameList2 = path2.list(FileNameFilter2.filter("b.*"));
for(String itemName : nameList2){
System.out.println(itemName);
}

System.out.println("------挑选当前目录下以s开头的文件或文件夹-------");
//3、将匿名内部类利用到极致
File path3 = new File(".");
String[] nameList3 = path3.list(
new FilenameFilter(){//其实是在第二种方式的基础上精简过来的。
private Pattern pattern = Pattern.compile("s.*");
/*将path3 传给dir*/
public boolean accept(File dir, String name) {
return pattern.matcher(name).matches();
}
}
);
for(String itemName : nameList3){
System.out.println(itemName);
}
}

result as follows :

------挑选当前目录下以.开头的文件或文件夹-------
.classpath
.myeclipse
.mymetadata
.project
.settings
------挑选上级目录下以b开头的文件或文件夹-------
book
book.zip
------挑选当前目录下以s开头的文件或文件夹-------
src

listFiles( ) :

list()和listFiles()方法的区别在于:

list()返回的是一个String类型数组,它只是一个数组,仅仅只是一个文件(文件夹)的名字而已;

而listFiles()方法返回的是一个File类的引用,它具有类的所有属性和方法,比如:String getName()方法就能够返回该文件的String类型的文件名(名字而已)。

下面的前三个方法返回File[]类型,第四个返回static File[]类型。

返回类型 :

该路径下所有文件或文件夹的绝对路径(pathname,注意File类型指的是路径,而不是文件)

1.listFiles()

2.listFiles(FileFilter filter)

3.listFiles(FilenameFilter filter)(上述讲过)

4.listRoots()
********************************************************************************************************************-
FileFilter接口的源代码:

public interface FileFilter {

/**
* Tests whether or not the specified abstract pathname should be
* included in a pathname list.
*
* @param pathname The abstract pathname to be tested
* @return <code>true</code> if and only if <code>pathname</code>
* should be included
*/
boolean accept(File pathname);

}

也要实现accept方法,但是传入的参数不一样,它是File类型的,而不是(File dir,String name)。这样的话就好办了。

  • 比如说,我要挑选文件夹:
class FileDirectory implements FileFilter{
@Override
public boolean accept(File pathname) {
return pathname.isDirectory();
}
}
  • 再比如说,我要挑选可执行文件:
class FileDirectory implements FileFilter{
@Override
public boolean accept(File pathname) {
return pathname.canExecute();
}
}
  • test
@Test
public void test3(){
System.out.println("-----判别当前目录下的文件是否为文件夹----");
//1、列出当前目录下的所有文件和文件夹,保存为File类对象的数组,判别其是否为文件夹
File path = new File(".");
System.out.println(path.getAbsolutePath());

File[] files = path.listFiles();
for(File f : files){
System.out.println(f + " ---> is a Directory? " + f.isDirectory());
}

System.out.println("-----挑选出当前目录下的所有文件夹----");
//2、挑选出当前目录下的所有文件夹
File path2 = new File(".");
File[] files2 = path2.listFiles(new FileFilter(){
public boolean accept(File pathname) {
return pathname.isDirectory();
}
});
for(File f : files2){
System.out.println(f);
}

System.out.println("-----挑选出当前目录下的所有以s开头的文件夹----");
//2、挑选出当前目录下的所有以s开头的文件夹
File path3 = new File(".");
File[] files3 = path3.listFiles(new FileFilter(){
public boolean accept(File pathname) {
Pattern pattern = Pattern.compile("s.*");
return pathname.isDirectory()&&pattern.matcher(pathname.getName()).matches();
}
});
for(File f : files3){
System.out.println(f);
}

System.out.println("-----挑选出当前目录下的所有以.开头的文件夹,并且标明文件属性----");
//3、挑选出当前目录下以.开头的文件或文件夹,并且在其后部标明f/d标明其为文件或文件夹
File path4 = new File(".");
File[] files4 = path4.listFiles(new FilenameFilter(){
Pattern pattern = Pattern.compile("\\..*");
public boolean accept(File dir, String name) {
return pattern.matcher(name).matches();
}
});
for(File f : files4){
String sfd = (f.isFile()) ? "file" : "dir";
System.out.println(f.getName() + "---->" + sfd);
}
}
  • result as follows :
-----判别当前目录下的文件是否为文件夹----
C:\Users\12746\Workspaces\MyEclipse 8.5\JAVASE-6\.
.\.classpath ---> is a Directory? false
.\.myeclipse ---> is a Directory? true
.\.mymetadata ---> is a Directory? false
.\.project ---> is a Directory? false
.\.settings ---> is a Directory? true
.\2.jpg ---> is a Directory? false
.\dbcp.txt ---> is a Directory? false
.\dbcp2.txt ---> is a Directory? false
.\dbcp3.txt ---> is a Directory? false
.\dbcp4.txt ---> is a Directory? false
.\hello.txt ---> is a Directory? false
.\hello2.txt ---> is a Directory? false
.\src ---> is a Directory? true
.\WebRoot ---> is a Directory? true
-----挑选出当前目录下的所有文件夹----
.\.myeclipse
.\.settings
.\src
.\WebRoot
-----挑选出当前目录下的所有以s开头的文件夹----
.\src
-----挑选出当前目录下的所有以.开头的文件夹,并且标明文件属性----
.classpath---->file
.myeclipse---->dir
.mymetadata---->file
.project---->file
.settings---->dir


举报

相关推荐

0 条评论