一、字符缓冲输入流

  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() 为特有的成员方法,可以读取一行的字符数据。

    行的终止符号:通过下列字符之一即可认为某行已终止:换行 ('\n')、回车 ('\r') 或回车后直接跟着换行(\r\n)。

    方法的返回值:包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 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("\r\n");  原先手动添加换行
 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 + "\n");//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 '\t'://\t表示tab 键字符
35                         bw.write("tab键=" + entry.getValue());
36                         break;
37                     case '\r'://
38                         bw.write("回车=" + entry.getValue());
39                         break;
40                     case '\n'://
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     }

 

posted on 2021-06-04 09:32  格物致知_Tony  阅读(115)  评论(0编辑  收藏  举报