BufferedReader和BufferedWriter是带有默认缓冲区的字符输入输出流,其效率相较于没有缓冲区要高:
1.java.io.BufferedReader和java.io.BufferedWriter类各拥有8192字符的缓冲区。当BufferedReader在读取文本文件时,会先尽量从文件中读入字符数据并置入缓冲区,而之后若使用read()方法,会先从缓冲区中进行读取。如果缓冲区数据不足,才会再从文件中读取,使用BufferedWriter时,写入的数据并不会先输出到目的地,而是先存储至缓冲区中。如果缓冲区中的数据满了,才会一次对目的地进行写出。
2. 从标准输入流System.in中直接读取使用者输入时,使用者每输入一个字符,System.in就读取一个字符。为了能一次读取一行使用者的输入,使用了BufferedReader来对使用者输入的字符进行缓冲。readLine()方法会在读取到使用者的换行字符时,再一次将整行字符串传入。
3. System.in是一个位流,为了转换为字符流,可使用InputStreamReader为其进行字符转换,然后再使用BufferedReader为其增加缓冲功能。
一 BufferedReader类
构造方法:BufferedReader br = new BufferReader(Reader in);
主要方法:int read();//读取单个字符。
int read(char[] cbuf,int off,int len);//将字符读入到数组的某一部分。返回读取的字符数。达到尾部 ,返回-1。
String readLine(); //读取一个文本行。
void close(); //关闭该流。并释放与该流相关的所有资源。
使用示例如下:
FileInputStream inputstream = new FileInputStream(System.in);
StringBuffer buffer = new StringBuffer();
String line; // 用来保存每行读取的内容
BufferedReader bufferreader = new BufferedReader(new InputStreamReader(inputstream));
line = bufferreader.readLine(); // 读取第一行
while (line != null) { // 如果 line 为空说明读完了
buffer.append(line); // 将读到的内容添加到 buffer 中
buffer.append("\n"); // 添加换行符
line = bufferreader.readLine(); // 读取下一行
}
inputstream.close(); //将读到 buffer 中的内容写出来
System.out.print(buffer) ;
二 BufferedWriter类
构造方法:bufferedWriter bf = new bufferedWriter(Writer out );
主要方法:void write(char ch);//写入单个字符。
void write(char []cbuf,int off,int len)//写入字符数据的某一部分。
void write(String s,int off,int len)//写入字符串的某一部分。
void newLine()//写入一个行分隔符。
void flush();//刷新该流中的缓冲。将缓冲数据写到目的文件中去。
void close();//关闭此流,再关闭前会先刷新他。
使用示例如下:
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
public class BufferedWriterDemo {
public static void main(String[] args) throws IOException {
FileWriter fw = new FileWriter("Buffered.txt");
fw.write("Hello Hello");
fw.close();
BufferedWriter bfw= new BufferedWriter(fw); //使用字符流的缓冲区提高效率
bfw.write("hello hello fast"); //使用缓冲区的方法将数据写入到缓冲区中
bfw.newLine();
bfw.write("hello hello world");
bfw.flush(); //使用缓冲区中的方法,将数据刷新到目的地文件中去
bfw.close();//关闭缓冲区,同时关闭fw流对象
}
}
综合应用示例:
以下程序主要完成从一个文档复制内容到另一个文档。
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class DocTransfer {
public static void main(String[] args) throws IOException {
FileReader fr = new FileReader("D:\\doc1.txt");
FileWriter fw = new FileWriter("D:\\doc2.txt");
BufferedReader bfr = new BufferedReader(fr);
BufferedWriter bfw = new BufferedWriter(fw);
String line = null;
while((line = bfr.readLine()) != null){
bfw.write(line);//一行一行字的写
bfw.newLine();
bfw.flush();
}
/*int ch = 0;
while((ch = bfr.read())!=-1){
bfw.write(ch);
}//一个字一个字的写*/
bfr.close();
bfw.close();
}
}