一、缓冲的字符流BufferedReader/BufferedWriter
1、采用缓冲处理是为了提高效率,如果没有缓存,例如FileReader对象,每次调用read()方法进行读操作时,都会直接去文件中读取字节,转换成字符并返回,这样频繁的读取文件效率很低。
2、缓冲的字符流的出现提高了对流的操作效率,原理就是将数组进行封装。
3、在使用缓冲的字符流对象时,缓冲的存在是为了增强流的功能,因此在建立缓冲的字符流对象时,要先有流对象的存在。
4、BufferedReader的特有方法:public String readLine();//一次读一行,到行标记时,将行标记之前的字符数据作为字符串返回。当读到末尾时,返回null。
5、BufferedWriter的特有方法:public void newLine();//写出平台相Q关的行分隔符来标记一行的终止。Windows平台下为’\n’。
注释:使用缓冲的字符流时其实就是使用流对象的方法,只不过加入了数组,对数据进行了临时存储,为了提高操作数据的效率。
方法readLine()的原理:该方法用的还是与缓冲的字符流相关联的流对象的read()方法,只不过,每一次读到一个字符,先不进行具体操作,先进行临时存储,当读取到回车标记时,将临时容器中存储的数据一次性返回。
装饰设计模式,对一组对象进行功能的增强。
装饰设计模式和继承有什么区别?
装饰设计模式比继承有更好的灵活性。继承需要派生子类,而运用装饰设计这种模式,只是在重复使用一个父类即可,而不用向继承一样,继承一次就会出现一个子类。总之,想要对数据的操作提高效率,用缓冲技术是非常可行的。
二、自己编写一个缓冲区MyBufferedReader
首先要确定类中的属性、构造方法然后采用readLine()方法:增加一个缓冲区。然后调用r对象的read()读取字符放到缓冲区,当读到标记时,把缓冲区的字符 转换成字符串返回。最后采用close方法将其关闭。
package com.hbsi.io;
import java.io.*;
public class MyBufferedReader {
//类中的属性
private Reader r;
//构造方法
public MyBufferedReader(Reader r){
this.r=r;
}
//readLine()方法:增加一个缓冲区。然后调用r对象的read()读取字符放到缓冲区,
//当读到标记时,把缓冲区的字符 转换成字符串返回
public String readLine(){
//缓冲区
StringBuffer strB=new StringBuffer();
int ch=0;
try {
while((ch=r.read())!=-1){
if(ch=='\r')
continue;
if(ch=='\n')
return new String(strB);
else
strB.append((char)ch);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(strB.length()!=0)
return new String(strB);
return null;
}
//close()方法
public void close(){
try {
r.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
三、字符缓冲流中BufferedReater和BufferedWrite类
通常。Reader所做的每个读取请求都会导致对底层字符或字节流进行相应的读取请求。如果没有缓冲流,则每次调用的read()或readLine()都会导致从文件中读取字节,并将其转换为字符后返回;每次调用print()方法都会导致将字符转换为字节,然后立即写出到文件,这些都是极其低效的。FileReader和FileWrite类一字符为单位进行输入/输出,数据的传输效率也很低。