1.File:
a.) FilenameFilter:
class DirFilter implements FilenameFilter{
private Pattern pattern;
public DirFilter(String args) {
pattern = Pattern.compile(args);
}
@Override
public boolean accept(File file, String filename) {
return pattern.matcher(filename).matches();
}
}
File file = new File(".");
String[] list;
if(args.length==0){
list= file.list();
}else{
list = file.list(new DirFilter(args[0]));
}
Arrays.sort(list,String.CASE_INSENSITIVE_ORDER);
for(String item :list){
System.out.println(item);
}
总结:list()方法会回掉FileNameaFilter接口的accept()方法,你可以在list()方法中指定FileNameFilter参数,这样list()可以按照你想要的方式生成字符数组,仅包含你需要的文件名。
accept()方法可以接收一个文件和文件名,它是实现FileNnameFilter的最重要的方法,你可以指定你接受哪些文件。
Pattern.compile(String regex) regex是正则表达式,这个方法生成一个按照指定正则表达式编译的Pattern,通过这个matcher(String)生成一个Matcher,matches进行匹配,匹配到返回true。
2.输入和输出(字节流):
read()读单个字节或者字节数组
write()写单个字节或者字节数组
SequenceInputStream:流序列
将两个或者多个InputStreama对象转换成单一的InputStream;
FilterInputStream:抽象类,为其他InputStream提供有用功能。
InputStream中有:
ByteArrayInputStream
StringBufferInputStream(已弃用) ---将String转换成InputStream 接受String参数,底层实现用的事StringBuffer
FileInputStream
PipedInputStream
SequenceInputStream
FilterInputStream
OutputStream中有:
ByteArrayOutputStream
FileOutSputtream
PipedOutputStream
FilterOutputStream
修饰流:
FilterInputStream和FilterOutStream
它们为修饰器类提供了一个基类,“装饰器”类把属性或者有用的接口与输出流连接了起来。
核心的”I/O 加上所有的修饰器,才能得到我们想要的I/O对象”
a.)FilterInputStream:
DataInputStream(InputStream) 允许我们读取不同的基本数据类型和String对象,各种read()方法,如readByte()、readFloat()。-------从流中读取
BufferedInputStream(InputStream):内部改变了InputStream的行为方式,对数据进行缓冲。------改变流的行为方式
b.)FilterOutStream:
DataOutStream(向流中写入,负责数据的存储)、PrintStream(负责数据的显示)、BufferedOutStream
3.Reader和Writer(字符流):
Reader和Writer提供兼容Unicode与面向字符的I/O功能
Reader和Writer是为了在所有的io操作中支持Unicode,为了国际化
InputStreamReader把InputStream转换成Reader
OutputStreamWriter把OutputStream转换成Writer
一般我们在编写程序的时候,尽量使用Writer和Reader(几乎所有原始I/O流类都有相应的Writer和Reader),不得已的时候选用面向字节的类库(java.util.zip类库就是面向字节的而不是面向字符的)
FileReader(Writer)
StringReader(Writer)
CharArrayReader(Writer)
PipedArrayReader(Writer)
修饰FilterWriter:
BufferedWriter
PrintWriter
2和3中最特殊的是DataOutPutStream,如果想以“可传输的” 格式存储和检索数据,它依然是首先。
4.RandomAccessFile(只适用于文件,大多数功能由nio的存储映射文件代替):
RandomAccessFile用于大小已知的记录组成的文件,它是独立的类,和InputStream和Op继承结构无关。
它有文件指针pointer
getFilePointer()指针位置
seek()文件内移动新的位置
Length()判断文件大小
“r” “rw”--构造函数第二个参数,访问方式
5.avaliable():
用来检查还有多少个可供读取的字符。
DataInputStream d = new DataInputStream(new BufferedInputStream(new FileInputStream("D:\\abc.txt")));
while(d.available() != 0){
System.out.print("还有"+d.available()+"个:"+(char)d.readByte());
}
6.DataOutPutStream DataIntPutStream:
writeUTF()和readUTF()可以使得String和其他数据类型相混合
String s = "D:\\abcd.txt";
File file = new File(s);//为文件指定编码方式
if(!file.exists()){
file.createNewFile();
}
DataOutputStream d = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(s)));
d.writeInt(1);
d.writeByte(2);
d.writeLong(68548964896578964l);
d.writeDouble(85468468d);
d.writeBoolean(false);
d.writeChars("结束");
d.flush();
d.close();
DataInputStream di = new DataInputStream(new BufferedInputStream(new FileInputStream(s)));
System.out.println(di.readInt());
System.out.println(di.readByte());
System.out.println(di);
System.out.println(di.readLong());
System.out.println(di.readChar());
1
2
java.io.DataInputStream@15db9742
68548964896578964
?
为了保证所有的读方法能正常工作,我们必须知道流中数据项所在的确切位置。所以他俩的时候,要么知道数据保存固定格式,要么有额外信息。
7.System.out和System.err被包装成了printStream对象
System.in是inputStream,读取它之前要进行包装。
PrintWriter可以接受一个OutputStream,而printStream是OutputStream,所以必要的时候可以把System.out转换成PrintWriter
8.标准I/O重定向:
System.setIn(InputStream)
System.setOut(PrintStream)
System.setErr(PrintStream)
重定向功能在特定情况下会很有用:
如果有了大量输出,并且输出滚动太快使得你无法阅读的时候,你重定向输出到一个文件中,这样方面阅读。
如果你要一段重复多次的命令行程序,你可以重定向输入到一个充满命令行的文件:
如下:我在abc里写了输入,我重定向输入abc,再把abc用作InputStream,把其中的内容输出并重定向到abcd文件中。
PrintStream console = System.out;
BufferedInputStream in = new BufferedInputStream(new FileInputStream("D:\\abc.txt"));
PrintStream out = new PrintStream(new FileOutputStream("D:\\abcd.txt"));
System.setIn(in);
System.setOut(out);
BufferedReader b = new BufferedReader(new InputStreamReader(System.in));
String s ;
while((s=b.readLine()) != null){
System.out.println(s);
}
b.close();
out.flush();
out.close();
in.close();
System.setOut(console);
9.进程控制:
Process p = new ProcessBuilder(xxxxxx).start();