Thinking In 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,通过这个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();

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值