1.字符流
1.缓冲区
缓冲区的出现提高了对数据的读写效率。
对应类:
BufferedWriter
BufferedReader
缓冲区要结合流才可以使用
2.使用
FileWriter fw=new FileWriter(“buf.txt”);
BufferedWriter bufw=new BufferedWriter(fw);
bufw.write(“abcd”);
//记住只要用到缓冲区,就要记得刷新。
bufw.flush();
//其实关闭缓冲区,就是再关闭缓冲区中的流对象,所以不需要进行fw.close()
bufw.close();
3.特有方法
提供了一个跨平台的换行符,用到缓冲区对象时可以使用newline()方法。
4.readline()方法返回的时候只返回回车符前面的内容,不返回回车符,所以我们需要手动调用newline()方法。
5.示例
6.装饰设计模式:
当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有的功能,并提供加强功能,那么自定义的该类就称为装饰类。(例如,readline()就是加强的read()定义类)
7.当我们进行功能扩展时,我们不需要为每个相关类都提供一个功能升级子类,这样会使得结构非常臃肿,我们可以定义一个装饰类加入到相关类的体系中,这样我们只要将相关类作为参数传递进我们的装饰类,当我们的装饰类出现问题的时候,我们能轻松的恢复以前能使用的功能,灵活性得到提高。
8.LineNumberReader给我们读取的数据加上行号。
getLineNumberReader();获取行号默认为0,(即行号从1开始)若前面设置,那么从设置开始。
setLineNumberReader(int number);设置行号从number+1开始显示
2.字节流
分为:InputStream和OutputStream
方法摘要:基本相同,唯一不同的是字符流使用的是字符数组,字节流使用的是字节数组。
1.字节操作不需要flush()操作,但如果用到缓冲区则需要。
2.注意操作read()方法返回值是int类型,我们需要将其强转char,才能打印。
3.available()返回文件字符总数,那么我们可以定义一个刚好大小的的缓冲区,不用循环了。数据如果太大,则不能使用这类方法,new一个很大的数组会造成内存溢出。
3.读取键盘录入
1.Inputstream对象中的System.in,调用read()方法读取输入的数据。
2.控制台:OutputStrema对象中的System.out
4.转换流
InputstreamReader:可以使用BufferedReader中的readline()
OutputStreamWriter:可以使用BufferedWriter中的newline()
键盘录入常见写法:
BufferedReader bufr=new BufferedReader(new InputSreamReader(System.in));
录入文件:
BufferedWriter bufw=new BufferedWriter(new OutputStremWriter(new FileOutputStrem(“c:bufw.txt”)))
可以指定编码表。
流操作的基本规律
1.明确源和目的
源:输入流 Inputstream Reader
目的:输出流 OutputStream Writer
2.操作的数据是否为纯文本
是:字符流
不是:字节流
3.当体系明确后,再明确要使用哪个具体的对象
通过设备来进行区分:
源设备:内存,硬盘,键盘
目的设备:内存,硬盘,控制台