zoukankan      html  css  js  c++  java
  • Java IO流:(十一)字符缓冲流

    一、字符缓冲输入流

      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     }
  • 相关阅读:
    ElasticSearch——Logstash输出到Elasticsearch配置
    ElasticSearch——分词
    Kafka——JVM调优
    HBase管理与监控——强制删除表
    HBase管理与监控——HBase region is not online
    HBase管理与监控——内存调优
    C#利用WMI获取 远程计算机硬盘数据
    防止SQL注入方法总结
    C# 将一个DataTable的结构直接复制到另一个DataTable
    C# 按位或,按位与, 按位异或
  • 原文地址:https://www.cnblogs.com/niujifei/p/14848222.html
Copyright © 2011-2022 走看看