import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
public class BufferedTest {
public void testBufferedReader()throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
char c;
String s;
System.out.println("br.read()"+" ");
do {
c = (char) br.read();
System.out.println(c);
}while (c!='q');
System.out.println("br.readline()"+ " ");
do {
s = br.readLine();
System.out.println(s);
}while (!s.equals("quit"));
System.out.println("OVER!");
}
public void testBufferedReaderFile() throws IOException,FileNotFoundException{
String line;
try(
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("0.txt")))){
while((line = br.readLine()) != null) {
System.out.println(line);
}
}catch(FileNotFoundException e) {
System.err.println("File Not Found!");
}catch(IOException e) {
e.printStackTrace();
}
}
public static void main(String [] args) throws IOException, FileNotFoundException{
BufferedTest bt = new BufferedTest();
bt.testBufferedReader();
bt.testBufferedReaderFile();
}
}
演示代码如上,注意一点是在readline时,退出时对字符串的相等判定使用equals方法,不用!=。
1、java.io.BufferedReader和java.io.BufferedWriter类各拥有8192字符的缓冲区。当BufferedReader在读取文本文件时,会先尽量从文件中读入字符数据并置入缓冲区,而之后若使用read()方法,会先从缓冲区中进行读取。如果缓冲区数据不足,才会再从文件中读取,使用BufferedWriter时,写入的数据并不会先输出到目的地,而是先存储至缓冲区中。如果缓冲区中的数据满了,才会一次对目的地进行写出。
2、从标准输入流System.in中直接读取使用者输入时,使用者每输入一个字符,System.in就读取一个字符。为了能一次读取一行使用者的输入,使用了BufferedReader来对使用者输入的字符进行缓冲。readLine()方法会在读取到使用者的换行字符时,再一次将整行字符串传入。
3、System.in是一个位流,为了转换为字符流,可使用InputStreamReader为其进行字符转换,然后再使用BufferedReader为其增加缓冲功能。
没有经过Buffered处理的IO, 意味着每一次读和写的请求都会由OS底层直接处理,这会导致非常低效的问题。
经过Buffered处理过的输入流将会从一个buffer内存区域读取数据,本地API只会在buffer空了之后才会被调用(可能一次调用会填充很多数据进buffer)。
经过Buffered处理过的输出流将会把数据写入到buffer中,本地API只会在buffer满了之后才会被调用。
BufferedReader/BufferedWriter可以将字符流(Reader)包装成缓冲流,这是最常见用的做法。
另外,BufferedReader提供一个readLine()可以方便地读取一行,而FileInputStream和FileReader只能读取一个字节或者一个字符,
因此BufferedReader也被称为行读取器
常用的代码:
从控制台输入的话,
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
需要读取文件的话,
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(filename,charset)));
需要注意后面的charset为编码方式,中午采用的常见为GB2312和UTF-8。
只验证BufferedReader方法,Writer类似。
参考
(https://blog.csdn.net/wiebin36/article/details/51912794,https://docs.oracle.com/javase/8/docs/api/java/io/BufferedReader.html,https://www.cnblogs.com/dongrilaoxiao/p/6688107.html)