BufferedReader 输入输出流

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)

你可能感兴趣的:(JAVA,IO)