JavaSE BufferedReader(字符输入缓冲流)

tech2026-09-24  2

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(); } }
最新回复(0)