java--基础--16.5--IO流--BufferedWriter,BufferedReader

本文介绍了Java中的字符流BufferedWriter和BufferedReader,它们是用于高效读写字符数据的流。BufferedWriter提供缓冲的字符输出,支持单个字符、数组和字符串的写入,包括自动换行功能。BufferedReader则提供缓冲的字符输入,能高效地读取字符、数组或整行数据。文章详细讲解了它们的构造方法、常用方法及使用示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

java–基础–16.5–IO流–BufferedWriter,BufferedReader


1、字符流

|--字符流 字符流 = 字节流 +编码表。
		|--字符输入流
			Reader                                   ------抽象类 
				int read():一次读取一个字符
				int read(char[] chs):一次读取一个字符数组
			
				|--InputStreamReader                 ------extends  Reader
					InputStreamReader = FileInputStream + 编码表(GBK)
					|--FileReader  					 ------extends InputStreamReader
						FileReader = FileInputStream + 编码表(GBK)
						
				
				|--BufferedReader                    ------extends  Reader
					String readLine():一次读取一个字符串
			
				|--StringReader                      ------extends  Reader
				
		|--字符输出流
			Writer                                   ------抽象类 
				void write(int ch):一次写一个字符
				void write(char[] chs,int index,int len):一次写一个字符数组的一部分
			
				|--OutputStreamWriter                ------extends Writer
						OutputStreamWriter = FileOutputStream + 编码表(GBK)
					|--FileWriter                    ------extends OutputStreamWriter
						FileWriter = FileOutputStream + 编码表(GBK)
				
				|--BufferedWriter                    ------extends Writer
					void newLine():写一个换行符
					void write(String line):一次写一个字符串
				
				|--PrintWriter                       ------extends Writer
				|--StringWriter                      ------extends Writer

2、BufferedWriter

将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。

可以指定缓冲区的大小,或者接受默认的大小。在大多数情况下,默认值就足够大了。

该类提供了 newLine() 方法,它使用平台自己的行分隔符概念,此概念由系统属性 line.separator 定义。并非所有平台都使用新行符 (‘\n’) 来终止各行。因此调用此方法来终止每个输出行要优于直接写入新行符。

通常 Writer 将其输出立即发送到底层字符或字节流。除非要求提示输出,否则建议用 BufferedWriter 包装所有其 write() 操作可能开销很高的 Writer如 FileWriters 和 OutputStreamWriters。例如

new PrintWriter(new BufferedWriter(new FileWriter("foo.out")));

将缓冲 PrintWriter 对文件的输出。如果没有缓冲,则每次调用 print() 方法会导致将字符转换为字节,然后立即写入到文件,而这是极其低效的。

2.1、构造方法:

  • BufferedWriter(Writer out):创建一个使用默认大小输出缓冲区的缓冲字符输出流。
  • BufferedWriter(Writer out, int sz):创建一个使用给定大小输出缓冲区的新缓冲字符输出流。

2.2、常用方法

  • void close() 关闭此流,但要先刷新它。
  • void flush() 刷新该流的缓冲。
  • void newLine() 写入一个行分隔符。
  • void write(char[] cbuf) 写入字符数组。
  • void write(char[] cbuf, int off, int len) 写入字符数组的某一部分。
  • void write(int c) 写入单个字符。
  • void write(String s) 写入字符串。
  • void write(String s, int off, int len) 写入字符串的某一部分。

2.3、案例

BufferedWriter bw = new BufferedWriter(new FileWriter("test.txt"));
char[] arr=new char[]{'q','w','e'};
//单个字符
bw.write("a");
bw.newLine();
//单个字符
bw.write(98);
bw.newLine();
//写入字符数组的某一部分
bw.write(arr,0,2);
bw.newLine();
//写入字符串
bw.write("fff");
bw.newLine();
//写入字符串的某一部分
bw.write("fff",0,2);
bw.newLine();

bw.flush();
bw.close();

输出:

test.txt
	a
	b
	qw
	fff
	ff

3、BufferedReader

从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。

可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了。

通常,Reader 所作的每个读取请求都会导致对底层字符或字节流进行相应的读取请求。因此,建议用 BufferedReader 包装所有其 read() 操作可能开销很高的 Reader如 FileReader 和 InputStreamReader。
例如

BufferedReader in = new BufferedReader(new FileReader("foo.in"));

将缓冲指定文件的输入。如果没有缓冲,则每次调用 read() 或 readLine() 都会导致从文件中读取字节,并将其转换为字符后返回,而这是极其低效的。
通过用合适的 BufferedReader 替代每个 DataInputStream,可以对将 DataInputStream 用于文字输入的程序进行本地化。

3.1、构造方法

  • BufferedReader(Reader in):创建一个使用默认大小输入缓冲区的缓冲字符输入流。
  • BufferedReader(Reader in, int sz):创建一个使用指定大小输入缓冲区的缓冲字符输入流。

3.2、常用方法

  • void close():关闭该流并释放与之关联的所有资源。
  • int read():读取单个字符。
  • int read(char[] cbuf, int off, int len):将字符读入数组的某一部分。
  • String readLine():一次读取一行数据 包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null
  • void mark(int readAheadLimit):标记流中的当前位置。
  • boolean markSupported():判断此流是否支持 mark(),操作它一定支持。
  • boolean ready():判断此流是否已准备好被读取。
  • void reset():将流重置到最新的标记。
  • long skip(long n):跳过字符。

3.3、案例

// 创建字符缓冲输入流对象
BufferedReader br = new BufferedReader(new FileReader("test.txt"));

 //方式1
System.out.println("------------方式1-------------");
 int ch = 0;
 while ((ch = br.read()) != -1) {
 	System.out.print((char) ch);
 }

// 方式2 效率比方式1高
System.out.println();
System.out.println("------------方式2-------------");
BufferedReader br2 = new BufferedReader(new FileReader("test.txt"));
char[] chs = new char[1024];
int len = 0;
while ((len = br2.read(chs)) != -1) {
	System.out.print(new String(chs, 0, len));
}
// 方式3  效率比方式2高
System.out.println("------------方式3-------------");
BufferedReader br3 = new BufferedReader(new FileReader("test.txt"));
String line = null;
while ((line = br3.readLine()) != null) {
	System.out.println(line);
}
// 释放资源
br.close();
br2.close();
br3.close();

输出:
------------方式1-------------
a
b
qw
fff
ff

------------方式2-------------
a
b
qw
fff
ff
------------方式3-------------
a
b
qw
fff
ff

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值