三、缓冲区
- 字符流的缓冲区:BufferedReader和BufferedWreiter
- 缓冲区的出现时为了提高流的操作效率而出现的.
- 需要被提高效率的流作为参数传递给缓冲区的构造函数
- 在缓冲区中封装了一个数组,存入数据后一次取出
BufferedReader示例:
读取流缓冲区提供了一个一次读一行的方法readline,方便对文本数据的获取。
readline()只返回回车符前面的字符,不返回回车符。如果是复制的话,必须加入newLine(),写入回车符
newLine()是java提供的多平台换行符写入方法。
[java] view plain copy
- import java.io.*;
- class BufferedReaderDemo {
-
public static void main(String[] args) throws IOException {
-
//创建一个字符读取流流对象,和文件关联
-
FileReader rw = new FileReader("buf.txt");
-
//只要将需要被提高效率的流作为参数传递给缓冲区的构造函数即可
-
BufferedReader brw = new BufferedReader(rw);
-
for(;;) {
-
String s = brw.readLine();
-
if(s==null) break;
-
System.out.println(s);
-
}
-
brw.close();//关闭输入流对象
-
}
- }
BufferedWriter示例:
[java] view plain copy
- import java.io.*;
- class BufferedWriterDemo {
-
public static void main(String[] args) throws IOException {
-
//创建一个字符写入流对象
-
FileWriter fw = new FileWriter("buf.txt");
-
//为了提高字符写入效率,加入了缓冲技术。
-
//只要将需要被提高效率的流作为参数传递给缓冲区的构造函数即可
-
BufferedWriter bfw = new BufferedWriter(fw);
-
//bfw.write("abc\r\nde");
-
//bfw.newLine(); 这行代码等价于bfw.write("\r\n"),相当于一个跨平台的换行符
-
//用到缓冲区就必须要刷新
-
for(int x = 1; x < 5; x++) {
-
bfw.write("abc");
-
bfw.newLine(); //java提供了一个跨平台的换行符newLine();
-
bfw.flush();
-
}
-
bfw.flush(); //刷新缓冲区
-
bfw.close(); //关闭缓冲区,但是必须要先刷新
-
//注意,关闭缓冲区就是在关闭缓冲中的流对象
-
fw.close(); //关闭输入流对象
-
}
- }
2.装饰设计模式
装饰设计模式::::
要求:自定义一些Reader类,读取不同的数据(装饰和继承的区别)
MyReader //专门用于读取数据的类
|–MyTextReader
|–MyBufferTextReader
|–MyMediaReader
|–MyBufferMediaReader
|–MyDataReader
|–MyBufferDataReader
如果将他们抽取出来,设计一个MyBufferReader,可以根据传入的类型进行增强
class MyBufferReader {
MyBufferReader (MyTextReader text) {}
MyBufferReader (MyMediaReader media) {}
MyBufferReader (MyDataReader data) {}
}
但是上面的类拓展性很差。找到其参数的共同类型,通过多态的形式,可以提高拓展性
class MyBufferReader extends MyReader{
private MyReader r; //从继承变为了组成模式 装饰设计模式
MyBufferReader(MyReader r) {}
}
优化后的体系:
|–MyTextReader
|–MyMediaReader
|–MyDataReader
|–MyBufferReader //增强上面三个。装饰模式比继承灵活,
避免继承体系的臃肿。降低类与类之间的耦合性
装饰类只能增强已有的对象,具备的功能是相同的。所以装饰类和被装饰类属于同一个体系
MyBuffereReader类: 自己写一个MyBuffereReader类,功能与BuffereReader相同
[java] view plain copy
- class MyBufferedReader1 extends Reader{
-
private Reader r;
-
MyBufferedReader1(Reader r){
-
this.r = r;
-
}
-
//一次读一行数据的方法
-
public String myReaderline() throws IOException {
-
//定义一个临时容器,原BufferReader封装的是字符数组。
-
//为了演示方便。定义一个StringBuilder容器。最终要将数据变成字符串
-
StringBuilder sb = new StringBuilder();
-
int ch = 0;
-
while((ch = r.read()) != -1)
-
{
-
if(ch == '\r')
-
continue;
-
if(ch == '\n') //遇到换行符\n,返回字符串
-
return sb.toString();
-
else
-
sb.append((char)ch);
-
}
-
if(sb.length()!=0) //当最后一行不是以\n结束时候,这里需要判断
-
return sb.toString();
-
return null;
-
}
-
/*
-
需要覆盖Reader中的抽象方法close(),read();
-
*/
-
public void close()throws IOException {
-
r.close();
-
}
-
public int read(char[] cbuf,int off, int len)throws IOException { //覆盖read方法
-
return r.read(cbuf,off,len);
-
}
-
public void myClose() throws IOException{
-
r.close();
-
}
- }