重温《JAVA编程思想》----2017.1.26 IO流(未完待续)

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,通过这个matcherString)生成一个Matchermatches进行匹配,匹配到返回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

 

 

修饰流:

 

FilterInputStreamFilterOutStream

 

它们为修饰器类提供了一个基类,“装饰器”类把属性或者有用的接口与输出流连接了起来。

核心的I/O 加上所有的修饰器,才能得到我们想要的I/O对象

 

a.)FilterInputStream  

 

DataInputStream(InputStream) 允许我们读取不同的基本数据类型和String对象,各种read()方法,如readByte()readFloat()-------从流中读取

BufferedInputStream(InputStream):内部改变了InputStream的行为方式,对数据进行缓冲。------改变流的行为方式

 

 

b.)FilterOutStream:

DataOutStream(向流中写入,负责数据的存储)PrintStream(负责数据的显示)BufferedOutStream

 

 

3.ReaderWriter(字符流):

 

ReaderWriter提供兼容Unicode与面向字符的I/O功能

 

 

ReaderWriter是为了在所有的io操作中支持Unicode,为了国际化

 

InputStreamReaderInputStream转换成Reader

OutputStreamWriterOutputStream转换成Writer

 

一般我们在编写程序的时候,尽量使用WriterReader(几乎所有原始I/O流类都有相应的WriterReader),不得已的时候选用面向字节的类库(java.util.zip类库就是面向字节的而不是面向字符的)

 

FileReader(Writer)

StringReader(Writer)

CharArrayReader(Writer)

PipedArrayReader(Writer)

 

 

修饰FilterWriter:

BufferedWriter

PrintWriter

 

 

 

 

 

 

23中最特殊的是DataOutPutStream,如果想以“可传输的” 格式存储和检索数据,它依然是首先。

 

 

 

4.RandomAccessFile(只适用于文件,大多数功能由nio的存储映射文件代替):

 

RandomAccessFile用于大小已知的记录组成的文件,它是独立的类,和InputStreamOp继承结构无关。

 

它有文件指针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.outSystem.err被包装成了printStream对象

  System.ininputStream,读取它之前要进行包装。

 

  PrintWriter可以接受一个OutputStream,printStreamOutputStream,所以必要的时候可以把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();

 

猜你喜欢

转载自blog.csdn.net/mypromise_tfs/article/details/54746770