java中的缓冲流有BufferedWriter和BufferedReader
在java api 手册中这样说缓冲流:
从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了。 通常,Reader 所作的每个读取请求都会导致对底层字符或字节流进行相应的读取请求。因此,建议用 BufferedReader 包装所有其 read() 操作可能开销很高的 Reader(如 FileReader 和 InputStreamReader)例如:
BufferedReader in = new BufferedReader(new FileReader("foo.in"));
从中可以看出
1.高效读取 字符、数组和行
2.缓冲区可以自己指定大小,默认为 8192 字节
3.缓冲流实际上是一个包装流,底层是字符流或者字节流
4.建议使用BufferedReader代替Reader
我们可以这样理解缓冲
这是一个完整的文件读取和写入操作,左边的浅蓝色框代表源文件,中间的是我们的java程序,右边的是目标文件。
缓冲流贯穿源、程序和目标文件。左侧表示读入文件,即文件的读操作。右侧是文件的写操作。
文件的读过程中有一个很重要的方法 readLine()
文件的读过程:
1.首先是将源文件读取到橙色的内存缓冲区,缓冲区默认大小是8192字节。
2.读取达到阈值 8192 字节或遇到 '\n' 或者 '\t' 表示读取结束。
3.将内存缓冲区的数据读取到程序中。
4.循环以上操作。
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException; public class BufferedReaderDemo {
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new FileReader("a.txt"));
String line = null;
while ((line = in.readLine()) != null) {
System.out.println(line);
} in.close();
}
}
写操作中,先将结果写入内存缓冲区,达到阈值或遇到 ‘\t’ 或 ‘\n’ 后写入磁盘。 write() 方法直接可以写字符串,还有一个newLine(),另起一行,可以理解为 System.out.print("\n") 的进化版。
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException; public class BufferedWriterDemo {
public static void main(String[] args) throws IOException {
BufferedWriter out=new BufferedWriter(new FileWriter("b.txt"));
out.write("问君能有几多愁?");
out.newLine();
out.write("恰似一江春水向东流。");
out.close();
}
}