缓冲流
- 缓冲流,也叫高效流,是在实体 I/O 上增加的一个缓冲区,应用程序和 I/O 设备之间的数据传输都要经过缓冲区来进行;
- 使用缓冲流可以减少应用程序与 I/O 设备之间的访问次数,提高访问效率;
- 可以对缓冲区的数据进行按需访问和预处理,增强访问的灵活性;
- 缓冲流的基本原理,是在创建流对象时,会创建一个内置的默认大小的缓冲区数组,通过缓冲区读写,减少系统 IO 次数,从而提高读写的效率;
- 缓冲流是 4 个基本流的增强,所以也是 4 个流,按照数据类型分为:
- 字节缓冲流:BufferedInputStream、BufferedOutputStream;
- 字符缓冲流:BufferedReader、BufferedWriter;
1. 缓冲输入流类
- 输入流读入的字节或字符数据都被缓冲输入流存入缓冲区,应用程序从缓冲区读取而不是从输入流读取;
- 包括字节缓冲输入流 BufferedInputStream 类和字符缓冲输入流 BufferedReader 类;
a. BufferedInputStream(字节缓冲输入流)
- 先通过实体输入流(例如 FileInputStream 类)对象逐一读取字节数据并存入缓冲区,应用程序则从缓冲区中读取数据;
构造方法 | 说明 |
---|
BufferedInputStream(InputStream in) | |
BufferedInputStream(InputStream in, int size) | size 为缓冲区大小 |
- BufferedInputStream 继承自 InputStream 类,与 InputStream 类使用方法相同;
b. BufferedReader(字符缓冲输入流)
- 与 BufferedInputStream 在功能和实现上相同,但只适用于字符读入;
构造方法 | 说明 |
---|
BufferedReader(Reader in) | |
BufferedReader(Reader in, int size) | size 为缓冲区大小 |
- BufferedReader 类继承自 Reader,与 Reader 类使用方法相同;
- 该类新增了按行读取的方法:
String readLine()
,该方法返回改行不包含结束符的字符串内容,如果已到达流末尾,则返回 null;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class Test {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new FileReader("C:\\Users\\80626\\Desktop\\1.txt"));
String line = null;
while ((line = br.readLine()) != null) {
System.out.print(line);
System.out.println("------");
}
br.close();
}
}
2. 缓冲输出流类
- 输出数据时,先存入缓冲区,缓冲区满了再一次性写到输出流中;
- 包括字节缓冲输出流 BufferedOutputStream 类和字符缓冲输出流 BufferedWriter 类;
a. BufferedOutputStream(字节缓冲输出流)
构造方法 | 说明 |
---|
BufferedOutputStream(OutputStream out) | |
BufferedOutputStream(OutputStream out, int size) | size 为缓冲区大小 |
- BufferedOutputStream 继承自 OutputStream 类,与 OutputStream 类使用方法相同;
b. BufferedWriter(字符缓冲输出流)
- 与 BufferedOutputStream 在功能和实现上相同,但只适用于字符读入;
构造方法 | 说明 |
---|
BufferedWriter(Writer out) | |
BufferedWriter(Writer out, int size) | size 为缓冲区大小 |
- BufferedWriter 类继承自 Writer,与 Writer 类使用方法相同;
- 该类新增了按行读取的方法:
String newLine()
,行分割字符串由系统属性 line.separator 定义;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
public class Test {
public static void main(String[] args) throws IOException {
BufferedWriter bw = new BufferedWriter(new FileWriter("C:\\Users\\80626\\Desktop\\2.txt"));
bw.write("3");
bw.newLine();
bw.write("2.5");
bw.newLine();
bw.write("");
bw.newLine();
bw.close();
}
}
3. 综合应用
import java.io.*;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
File file;
FileReader fin;
FileWriter fout;
BufferedReader bin;
BufferedWriter bout;
Scanner scanner = new Scanner(System.in);
System.out.println("请输入文件名,例如C:\\Users\\80626\\Desktop\\1.txt");
String filename = scanner.nextLine();
try {
file = new File(filename);
if (!file.exists()) {
file.createNewFile();
fout = new FileWriter(file);
} else
fout = new FileWriter(file, true);
fin = new FileReader(file);
bin = new BufferedReader(fin);
bout = new BufferedWriter(fout);
System.out.println("请输入数据,最后一行为字符‘0’结束。");
String str = scanner.nextLine();
while (!str.equals("0")) {
bout.write(str);
bout.newLine();
str = scanner.nextLine();
}
bout.flush();
bout.close();
fout.close();
System.out.println("文件写入完毕!");
System.out.println("文件" + filename + "的内容是:");
while ((str = bin.readLine()) != null)
System.out.println(str);
bin.close();
fin.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
推荐阅读:[Java] 文本排序 >>>