JavaSE BufferedReader(字符输入缓冲流)

Java自我学习路线

  • 缓冲流
  • 一、BufferedReader(字符输入缓冲流)
    • 构造方法
      • 1. BufferedReader(Reader in)
      • 2. BufferedReader(Reader in, int sz)
    • 二、JDK中实现自动关闭流
    • 三、测试用例
    • 四、转换流InputStreamReader

缓冲流

  • 缓冲流主要是为了提高效率而存在的,减少物理读取次数,缓冲流主要有:BufferedInputStream、BufferedOutputStream、BufferedReader、BufferedWriter
  • 由于涉及磁盘的IO操作相比内存的操作要慢很多,所以不带缓冲的流效率很低,带缓冲的流,可以一次读很多字节,但不向磁盘中写入,只是先放到内存里,等凑够了缓冲区大小的时候一次性写入磁盘,这种方式可以减少磁盘操作次数,提高速度
  • 因为实现了缓冲功能,所以要注意在使用BufferedInputStream、BufferedOutputStream写完数据后,要调用flush()方法或close()方法,强行将缓冲区中的数据写出,否则可能无法写出数据
  • BufferedReader 提供了实用方法readLine(),可以直接读取一行,但不带换行符
  • BufferedWriter 提供了 newLine()可以写换行符

一、BufferedReader(字符输入缓冲流)

  • BufferedReader是带有缓冲区的字符输入流,使用这个流的时候不需要自定义char数组(byte数组),因为BufferedReader自带缓冲

构造方法

  • 构造方法中传进来的流叫做节点流,直接与数据源相连,用于输入或者输出
  • 外部负责包装的这个流,叫做:包装流/处理流,是在节点流的基础上对之进行加工,进行一些功能的扩展,处理流的构造方法必须要传入节点流的子类,对于包装流来说,只需要关闭最外层流就行,里面的节点流会自动关闭( in.close() )
  • 节点流与包装流是相对而言的
  • 构造方法中的形参Reader是一个抽象类(public abstract class Reader implements Readable, Closeable) ,没有办法实例化对象,所以可以使用它的子类实例化对象,比如FileReader(FileReader ->InputStreamReader->Reader)

1. BufferedReader(Reader in)

  • 创建一个使用默认大小输入缓冲区的缓冲字符输入流
public BufferedReader(Reader in) {
     
    this(in, defaultCharBufferSize);
}

2. BufferedReader(Reader in, int sz)

  • 创建一个使用指定大小输入缓冲区的缓冲字符输入流
public BufferedReader(Reader in, int sz) {
     
    super(in);
    if (sz <= 0)
        throw new IllegalArgumentException("Buffer size <= 0");
    this.in = in;
    cb = new char[sz];
    nextChar = nChars = 0;
}

二、JDK中实现自动关闭流

  • 对于包装流来说,只需要关闭最外层流就行,里面的节点流会自动关闭( in.close() )
public void close() throws IOException {
     
    synchronized (lock) {
     
        if (in == null)
            return;
        try {
     
            in.close(); // 关闭流,其中in是:private Reader in;
        } finally {
     
            in = null;
            cb = null;
        }
    }
}

三、测试用例

import java.io.BufferedReader;
import java.io.FileReader;

public class BufferedReaderTest {
     
	public static void main(String[] args) throws Exception {
     
		// 当一个流的构造方法中需要一个流的时候,这个被传进来的流叫做:节点流
		// 外部负责包装的这个流,叫做:包装流/处理流
		// FileReader是一个节点流,BufferedReader是包装流/处理流
		FileReader reader = new FileReader("file"); // Reader是一个抽象类,不能实例化对象,所以使用FileReader实例化对象传入BufferedReader中
		BufferedReader br = new BufferedReader(reader);

		// 读一行(br.readLine()方法读取一个文本行,但不带换行符)
		/*
		 * String firstLine = br.readLine();
		 * System.out.println(firstLine);
		 * 
		 * String secondLine = br.readLine();
		 * System.out.println(secondLine);
		 * 
		 * String line3 = br.readLine();
		 * System.out.println(line3);
		 */

		String s = null;
		while ((s = br.readLine()) != null) {
     
			System.out.print(s); // 不带换行符
		}

		// 关闭流(对于包装流来说,只需要关闭最外层流就行,里面的节点流会自动关闭)
		br.close();
	}
}

四、转换流InputStreamReader

  • BufferedReader的构造方法中只能传一个字符流,不能传字节流,所以使用 InputStreamReader 将字节流输入流转换成字符输入流
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;

public class BufferedReaderTest {
     
	public static void main(String[] args) throws Exception {
     

		// 字节流
		FileInputStream in = new FileInputStream("file");
		// 通过转换流转换(InputStreamReader将字节流转换成字符流),in是节点流,reader是包装流
		InputStreamReader reader = new InputStreamReader(in);

		// 这个构造方法只能传一个字符流,不能传字节流
		// reader是节点流,br是包装流
		// 节点流与包装流是相对而言的
		BufferedReader br = new BufferedReader(reader);

		// 简写
//		BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("file")));

		String line = null;
		while ((line = br.readLine()) != null) {
     
			System.out.println(line);
		}

		// 关闭最外层
		br.close();
	}
}

你可能感兴趣的:(JavaSE学习路线,java)