1. 程式人生 > >[隨筆][Java][讀書筆記][thinking in java][第十八章 Java I/O系統]

[隨筆][Java][讀書筆記][thinking in java][第十八章 Java I/O系統]

參數 數列 == tar 目錄樹 返回 匿名類 string 筆記

18.1 File類

  • 目錄列表器。兩種方法使用File對象查看一個目錄列表。
import java.util.regex.*;
import java.io.*;
import java.util.*;

public class DirList {
    public static void main(String[] args) {
        File path = new File(".");
        String[] list;
        if(args.length == 0) {
            list = path.list();
        }
        else {
            list = path.list(new DirFilter(args[0]));
        }
        Arrays.sort(list, String.CASE_INSENSITIVE_ORDER);
        for(String dirItem : list) {
            System.out.println(dirItem);
        }
    }
}

class DirFilter implements FilenameFilter {
    private Pattern pattern;
    public DirFilter(String regex) {
        pattern = Pattern.compile(regex);
    }
    public boolean accept(File dir, String name) {
        return pattern.matcher(name).matches();
    }
}

//輸出
.idea
demo.iml
pom.xml
src
target
  • File.list()方法在接收參數的時候,接受FilenameFilter接口的子類的對象,然後對於每個文件名,調用其accept方法進行判斷。創建DirFilter類的目的是將accept()方法提供給list()方法使用,使list()回調accept(),進而決定哪些文件包含在列表中。
  • 對上面的例子使用匿名內部類進行改寫。首先創建一個fileter()方法,返回一個指向FilenameFilter的引用。
import java.util.regex.*;
import java.io.*;
import java.util.*;

public class DirList2 {
    public static FilenameFilter filter(final String regex) {        //向filter傳遞參數必須是**final**的,這在匿名內部類中是必須的,這樣它才能夠使用來自該類範圍外的對象。!!!!
        //創建一個內部類
        return new FilenameFilter() {            //實現了FilenameFilter接口,同時覆蓋了接口中的accept方法。
            private Pattern pattern = Pattern.compile(regex);
            public boolean accept(File dir, String name) {
                return pattern.matcher(name).matches();
            }
        };
        //結束創建內部類
    }

    public static void main(String[] args) {
        File path = new File(".");
        String[] list;
        if(args.length == 0) {
            list = path.list();
        }
        else {
            list = path.list(filter(args[0]));
        }
        Arrays.sort(list, String.CASE_INSENSITIVE_ORDER);
        for(String dirItem : list) {
            System.out.println(dirItem);
        }
    }
}
  • 匿名內部類沒有名字,所以它必須繼承自一個父類或者是新啊某個接口。創建內部匿名類的語法是
new 父類構造器(參數列表)| 接口 () {
    //匿名內部類的主體部分
}
  • 進一步改進,將匿名類作為參數傳遞給list()方法
import java.util.regex.*;
import java.io.*;
import java.util.*;

public class DirList3 {
    public static void main(String[] args) {
        File path = new File(".");
        String[] list;
        if(args.length == 0)
            list = path.list();
        else
            list = path.list(new FilenameFilter() {
                private Pattern pattern = Pattern.compile(args[0]);
                public boolean accept(File dir, String name) {
                    return pattern.matcher(name).matches();
                }
            });
        Arrays.sort(list, String.CASE_INSENSITIVE_ORDER);
        for(String dirItem : list)
            System.out.println(dirItem);
    }
}
  • ???了解一下final關鍵字,匿名內部類的參數需要是final的。

  • 使用local()方法產生由本地目錄中的文件構成的File對象數組;通過walk()方法產生給定目錄下的由整個目錄樹中所有文件構成的List

[隨筆][Java][讀書筆記][thinking in java][第十八章 Java I/O系統]