一、字符缓冲输入流
1、BufferedReader 概述
BufferedReader 是套接在字符流上面的缓冲流,可以高效的读取数据。
2、BufferedReader 类结构
3、构造方法
BufferedReader(Reader in) 创建一个使用默认大小输入缓冲区的缓冲字符输入流。
BufferedReader(Reader in, int sz) 创建一个使用指定大小输入缓冲区的缓冲字符输入流。
参数:
Reader in:字符输入流,可以传递FileReader,缓冲流会给FileReader增加一个缓冲区,提高FileReader的读取效率
int sz:指定缓冲区的大小,不写默认大小
4、常用方法
int read() 读取单个字符并返回。
int read(char[] cbuf)一次读取多个字符,将字符读入数组。
void close() 关闭该流并释放与之关联的所有资源。
String readLine() 读取一个文本行。读取一行数据
其中 readLine() 为特有的成员方法,可以读取一行的字符数据。
行的终止符号:通过下列字符之一即可认为某行已终止:换行 (' ')、回车 (' ') 或回车后直接跟着换行( )。
方法的返回值:包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null。
5、使用步骤
① 创建字符缓冲输入流对象,构造方法中传递字符输入流
② 使用字符缓冲输入流对象中的方法read/readLine读取文本
③ 释放资源
6、案例
1 public static void main(String[] args) throws IOException {
2 //1.创建字符缓冲输入流对象,构造方法中传递字符输入流
3 BufferedReader br = new BufferedReader(new FileReader("10_IO\c.txt"));
4
5 //2.使用字符缓冲输入流对象中的方法read/readLine读取文本
6 /*String line = br.readLine();
7 System.out.println(line);
8
9 line = br.readLine();
10 System.out.println(line);*/
11
12 /*
13 发下以上读取是一个重复的过程,所以可以使用循环优化
14 不知道文件中有多少行数据,所以使用while循环
15 while的结束条件,读取到null结束
16 */
17 String line;
18 while((line = br.readLine())!=null){
19 System.out.println(line);
20 }
21
22 //3.释放资源
23 br.close();
24 }
7、
二、字符缓冲输出流
1、BufferedWriter 概述
BufferedWriter 是套接在字符流上面的缓冲流,可以高效的写出数据。
2、BufferedWriter 类结构
3、构造方法
BufferedWriter(Writer out) 创建一个使用默认大小输出缓冲区的缓冲字符输出流。
BufferedWriter(Writer out, int sz) 创建一个使用给定大小输出缓冲区的新缓冲字符输出流。
参数:
writer out:字符输出流,可以传递FileWriter,缓冲流会给FileWriter增加一个缓冲区,提高FileWriter的写入效率
int sz:指定缓冲区的大小,不写默认大小
4、常用方法
void write(int c) 写入单个字符。
void write(char[] cbuf)写入字符数组。
abstract void write(char[] cbuf, int off, int len)写入字符数组的某一部分,off数组的开始索引,len写的字符个数。
void write(String str)写入字符串。
void write(String str, int off, int len) 写入字符串的某一部分,off字符串的开始索引,len写的字符个数。
void flush()刷新该流的缓冲。
void close() 关闭此流,但要先刷新它。
void newLine() 写入一个行分隔符。会根据不同的操作系统,获取不同的行分隔符
其中 newLine() 为该类特有的成员方法,调用该方法,会根据所在系统自动添加换行符。
5、使用步骤
① 创建字符缓冲输出流对象,构造方法中传递字符输出流;
② 调用字符缓冲输出流中的方法write,把数据写入到内存缓冲区中;
③ 调用字符缓冲输出流中的方法flush,把内存缓冲区中的数据,刷新到文件中;
④ 释放资源;
6、案例
1 public static void main(String[] args) throws IOException {
2 //1.创建字符缓冲输出流对象,构造方法中传递字符输出流
3 BufferedWriter bw = new BufferedWriter(new FileWriter("E:\c.txt"));
4 //2.调用字符缓冲输出流中的方法write,把数据写入到内存缓冲区中
5 for (int i = 0; i <10 ; i++) {
6 bw.write("java程序员");
7 //bw.write("
"); 原先手动添加换行
8 bw.newLine(); // 调用换行方法
9 }
10 //3.调用字符缓冲输出流中的方法flush,把内存缓冲区中的数据,刷新到文件中
11 bw.flush();
12 //4.释放资源
13 bw.close();
14 }
7、
三、案例
1、实现文本文件的复制
1 @Test
2 public void testBufferedReaderBufferedWriter(){
3 BufferedReader br = null;
4 BufferedWriter bw = null;
5 try {
6 //创建文件和相应的流
7 br = new BufferedReader(new FileReader(new File("dbcp.txt")));
8 bw = new BufferedWriter(new FileWriter(new File("dbcp1.txt")));
9
10 //读写操作
11 //方式一:使用char[]数组
12 // char[] cbuf = new char[1024];
13 // int len;
14 // while((len = br.read(cbuf)) != -1){
15 // bw.write(cbuf,0,len);
16 // // bw.flush();
17 // }
18
19 //方式二:使用String
20 String data;
21 while((data = br.readLine()) != null){
22 //方法一:
23 // bw.write(data + "
");//data中不包含换行符
24 //方法二:
25 bw.write(data);//data中不包含换行符
26 bw.newLine();//提供换行的操作
27
28 }
29
30
31 } catch (IOException e) {
32 e.printStackTrace();
33 } finally {
34 //关闭资源
35 if(bw != null){
36
37 try {
38 bw.close();
39 } catch (IOException e) {
40 e.printStackTrace();
41 }
42 }
43 if(br != null){
44 try {
45 br.close();
46 } catch (IOException e) {
47 e.printStackTrace();
48 }
49
50 }
51 }
52
53 }
2、获取文本上每个字符出现的次数
(1)遍历文本每一个字符;
(2)字符出现的次数存在Map中;
(3)把map中的数据写入文件
1 @Test
2 public void testWordCount() {
3 FileReader fr = null;
4 BufferedWriter bw = null;
5 try {
6 //1.创建Map集合
7 Map<Character, Integer> map = new HashMap<Character, Integer>();
8
9 //2.遍历每一个字符,每一个字符出现的次数放到map中
10 fr = new FileReader("dbcp.txt");
11 int c = 0;
12 while ((c = fr.read()) != -1) {
13 //int 还原 char
14 char ch = (char) c;
15 // 判断char是否在map中第一次出现
16 if (map.get(ch) == null) {
17 map.put(ch, 1);
18 } else {
19 map.put(ch, map.get(ch) + 1);
20 }
21 }
22
23 //3.把map中数据存在文件count.txt
24 //3.1 创建Writer
25 bw = new BufferedWriter(new FileWriter("wordcount.txt"));
26
27 //3.2 遍历map,再写入数据
28 Set<Map.Entry<Character, Integer>> entrySet = map.entrySet();
29 for (Map.Entry<Character, Integer> entry : entrySet) {
30 switch (entry.getKey()) {
31 case ' ':
32 bw.write("空格=" + entry.getValue());
33 break;
34 case ' ':// 表示tab 键字符
35 bw.write("tab键=" + entry.getValue());
36 break;
37 case '
'://
38 bw.write("回车=" + entry.getValue());
39 break;
40 case '
'://
41 bw.write("换行=" + entry.getValue());
42 break;
43 default:
44 bw.write(entry.getKey() + "=" + entry.getValue());
45 break;
46 }
47 bw.newLine();
48 }
49 } catch (IOException e) {
50 e.printStackTrace();
51 } finally {
52 //4.关流
53 if (fr != null) {
54 try {
55 fr.close();
56 } catch (IOException e) {
57 e.printStackTrace();
58 }
59
60 }
61 if (bw != null) {
62 try {
63 bw.close();
64 } catch (IOException e) {
65 e.printStackTrace();
66 }
67
68 }
69 }
70
71 }