[隨筆][Java][讀書筆記][thinking in java][第十八章 Java I/O系統]
阿新 • • 發佈:2018-09-07
參數 數列 == 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系統]