缓冲字符流BufferedReader/BufferedWriter
缓冲的字符流的出现提高了对流的操作效率,原理就是将数组进行封装
在使用缓冲的字符流对象时,缓冲的存在是为了增强流的功能,因此在建立缓冲的字符流对象时,要先有流对象的存在。
BufferedReader的特有方法:public String readLine();//一次读一行,到行标记时,将行标记之前的字符数据作为字符串返回。当读到末尾时,返回null。
BufferedWriter的特有方法:public void newLine();//写出平台相关的行分隔符来标记一行的终止。Windows平台下为’\n’。
缓冲字符流的使用
FileWriter fw=null;
BufferedWriter bw=null;
//缓冲字符输出流去写入数据
try {
fw=new FileWriter("demo.txt");
bw=new BufferedWriter(fw);
bw.write("Hello");
bw.newLine();//换行符标记
bw.write("Java");
bw.newLine();
bw.flush();//把缓冲区里的内容刷新到目的地
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(bw!=null){
try {
bw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//读出
FileReader fr=null;
BufferedReader br=null;
try {
fr=new FileReader("demo.txt");//节点流
br=new BufferedReader(fr,255);//255为缓冲区的大小
String str=null;//用于存储每一次读取出来的数据
while((str=br.readLine())!= null){
System.out.println(str);
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(br!=null){
try {
br.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
自己建的缓冲字符输入流
package a;
import java.io.*;
public class MyBufferedReader {
//自己定义缓冲区,类里面的属性
private Reader r;//代表普通输入流对象
//构造方法
public MyBufferedReader(Reader r){
this.r=r;
}
//read方法,读一行的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 strB.toString();//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();
}
}
}
装饰设计模式比继承有更好的灵活性