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

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
文件解密是指将加密过的文件还原成原始的文件。在Java中,可以使用文件字符IO流来实现文件解密。 首先,需要使用FileReader类来读取加密文件中的字符流。然后,使用自定义的解密算法对字符流进行解密。最后,使用FileWriter类将解密后的字符流写入到新的文件中。 以下是一个简单的Java文件解密示例代码: ```java import java.io.*; public class FileDecryptor { public static void main(String[] args) { try { // 读取加密文件 FileReader fr = new FileReader("encrypted.txt"); BufferedReader br = new BufferedReader(fr); // 解密字符流 String line; StringBuilder sb = new StringBuilder(); while ((line = br.readLine()) != null) { sb.append(decrypt(line)); } // 写入解密后的文件 FileWriter fw = new FileWriter("decrypted.txt"); BufferedWriter bw = new BufferedWriter(fw); bw.write(sb.toString()); // 关闭流 br.close(); fr.close(); bw.close(); fw.close(); } catch (IOException e) { e.printStackTrace(); } } // 自定义解密算法 private static String decrypt(String line) { // TODO: 实现解密算法 return line; } } ``` 在上面的代码中,我们使用了FileReader和FileWriter类来读写文件,使用BufferedReaderBufferedWriter类来提高读写效率。同时,我们也定义了一个decrypt方法来实现自定义的解密算法。在实际应用中,需要根据具体的加密算法来实现decrypt方法。 希望这个简单的示例能够帮助你理解Java文件解密的基本原理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值