BufferedReader和BufferedWriter比较适合处理文本文件,如果是二进制文件,有可能会有错误。
一、BufferedReader
从字符输入流读取文本,缓冲字符,以提供字符,数组和行的高效读取。
可以指定缓冲区大小,或者可以使用默认大小。 默认值足够大,可用于大多数用途。
通常,由读取器做出的每个读取请求将引起对底层字符或字节流的相应读取请求。 因此,建议将BufferedReader包装在其read()操作可能昂贵的读取器上,例如FileReaders和InputStreamReaders。 例如,
BufferedReader in = new BufferedReader(new FileReader("foo.in"));
1 构造方法
BufferedReader(Reader in) | 创建使用默认大小的输入缓冲区的缓冲字符输入流。 |
BufferedReader(Reader in, int sz) | 创建使用指定大小的输入缓冲区的缓冲字符输入流。 |
2 方法
下面介绍几个比较常用的方法
2.1 read()
字符读取,作为0到65535( 0x00-0xffff )范围内的整数,如果已经达到流的结尾,则为-1。
2.2 readLine()
读一行文字,不包含换行符。 一行被视为由换行符(‘\ n’),回车符(‘\ r’)中的任何一个或随后的换行符终止。
包含行的内容的字符串,不包括任何行终止字符,如果已达到流的末尾,则为null。
二、BufferedWriter
1 构造方法
BufferedWriter(Writer out) | 创建使用默认大小的输出缓冲区的缓冲字符输出流。 |
BufferedWriter(Writer out, int sz) | 创建一个新的缓冲字符输出流,使用给定大小的输出缓冲区。 |
2 方法
三、纯文本文件拷贝
1 每次读取一个字节
@Test
@DisplayName("每次读取一个字节")
public void testFileReader() {
String filePath = "src/main/resources/json/student_array.json";
String fileCopyPath = "src/main/resources/json/student_array_copy_buffered.json";
try (BufferedReader bufferedReader = new BufferedReader(new FileReader(filePath));
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(fileCopyPath))
) {
int data;
while ((data = bufferedReader.read()) != -1) {
bufferedWriter.write(data);
}
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
2 每次读取一个行
因为readLine()不包含换行符,所以写的时候要调用newLine()
@Test
@DisplayName("每次读取一个行")
public void testFileReaderLine() {
String filePath = "src/main/resources/json/student_array.json";
String fileCopyPath = "src/main/resources/json/student_array_copy_buffered.json";
try (BufferedReader bufferedReader = new BufferedReader(new FileReader(filePath));
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(fileCopyPath))
) {
String thisLine;
while ((thisLine = bufferedReader.readLine()) != null) {
bufferedWriter.write(thisLine);
//因为readLine()不包含换行符,所以写的时候要调用newLine()
bufferedWriter.newLine();
}
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
}
}