一为何说建立一个好的输入/输出(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 时,该名称才知足过滤器。