一爲何說建立一個好的輸入/輸出(I/O)系統是一項艱難的任務?java
1不只存在各類I/O源端和想要與之通訊的接收端(文件,控制檯,網絡連接等),並且還須要以多種不一樣的方式與他們通訊(順序,隨機存取,緩衝,二進制,按字符,按行,按字等)。數組
2解決方法:java類庫的設計者經過建立大量的類來解決這個難題。網絡
二File類ui
File(文件)並不是指代的是文件。它既能表明一個特定的文件的名稱,又能表明一個目錄下的一組文件的名稱。若是它指的是一個文件集,咱們就能夠對此結合調用list()方法,這個方法會返回一個字符數組。spa
1目錄列表器設計
能夠用兩種方法來使用File對象:(1)調用不帶參數的list()方法,即可以得到此File對象包含的所有列表。(2)若是想要得到一個受限列表,例如想要得到全部擴展名爲.java的文件,那咱們就要用到「目錄過濾器」,這個類會告訴咱們怎樣顯示符合條件的File對象。code
法一:經過實現FilenameFilter接口實現
對象
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 接口 |
|
package IO;
import java.io.File; import java.io.FilenameFilter; import java.util.Arrays; import java.util.regex.Pattern;
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); } }
/* * 建立這個類的目的在於把accept()方法提供給list()使用,使list()能夠回調accetp(),進而能夠決定哪些文件 * 包含在列表中。這種結構也經常稱爲回調。 */ 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(); } } ci |
法二:內部類
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
|
|
package IO;
import java.io.File; import java.io.FilenameFilter; import java.util.Arrays; import java.util.regex.Pattern;
public class DirList2 { public static FilenameFilter filter(final String regex){ return new FilenameFilter(){ 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); } }
|
法三:定義一個做爲list()參數的匿名內部類
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
|
|
package IO;
import java.io.File; import java.io.FilenameFilter; import java.lang.reflect.Array; import java.util.Arrays; import java.util.regex.Pattern;
public class DirList3 { public static void main(final 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); } }
|
輸出結果以下:
.classpath
.project
.settings
build
src
WebContent
list方法總結
(1)public String[] list()返回一個字符串數組,這些字符串指定此抽象路徑名錶示的目錄中的文件和目錄。
(2)public String[] list(FilenameFilter filter)返回一個字符串數組,這些字符串指定此抽象路徑名錶示的目錄中知足指定過濾器的文件和目錄。若是給定 filter 爲 null,則接受全部名稱。不然,當且僅當在此抽象路徑名及其表示的目錄中的文件名或目錄名上調用過濾器的 FilenameFilter.accept(java.io.File, java.lang.String) 方法返回 true 時,該名稱才知足過濾器。