缓冲流,也叫高效流,是对4个基本的Filexxx流的增强,所以也是4个流,按照数据类型分类:

  • 字节缓冲流:BufferedInputStream,BufferedOutputStream
  • 字符缓冲流:BufferedReader,BufferedWriter

缓冲流的基本原理,是在创建流对象时,会创建一个内置的默认大小的缓冲区数组,通过缓冲区读写,减少系统IO次数,从而提高读写的效率。

①字节缓冲流

1 package com.Lucky.io.BufferStream;
 2 
 3 import java.io.*;
 4 
 5 /*
 6  字节缓冲流: 是字节流的高级流之一【效率比基础的字节流高的多】
 7  格式:       缓冲流  名称 = new 缓冲流(new 基础流)
 8              例如:    BufferedInputStream bufInStr=
 9                                new BufferedInputStream(new FileInputStream());
10 
11  */
12 
13 /**
14  * 其他的跟基础流一样【同样可以使用数组来进行一次读取多个字节】
15  */
16 public class byteBufferStream {
17     public static void main(String[] args) throws IOException {
18         BufferedInputStream bufInStr=
19                 new BufferedInputStream(new FileInputStream("H:\\项目\\javaSE\\IO\\src\\com\\Lucky\\io\\BufferStream\\bufferTest.txt"));
20         BufferedOutputStream bufOutStr=
21                 new BufferedOutputStream(new FileOutputStream("H:\\项目\\javaSE\\IO\\src\\com\\Lucky\\io\\BufferStream\\copy.txt"));
22 
23          int val;
24         while ((val=bufInStr.read())!=-1){
25             bufOutStr.write(val);
26         }
27 
28         bufOutStr.close();    //不用关闭基础流,因为在缓冲流的底层中已经将基础流进行colse
29         bufInStr.close();
30 
31     }
32 }

②字符缓冲流

1 package com.Lucky.io.BufferStream;
 2 
 3 import java.io.*;
 4 
 5 /*
 6 字符缓冲流: 是字符流的高级流之一【效率比基础的字符流高一点,因为在字符流中本身就存在缓冲区】
 7  格式:       缓冲流  名称 = new 缓冲流(new 基础流)
 8              例如:           BufferedReader reader=
 9                                            new BufferedReader(new FileReader(""));
10 
11 
12  */
13 
14 /**
15  * 其他的跟基础流一样【同样可以使用数组来进行一次读取多个字节】
16  * 注意点:相对于字符基础流来说,多了2个独有的方法【readLine】一次读取一行数据
17  *                                      【newLine】  换行
18  *
19  */
20 public class charBufferStream {
21     public static void main(String[] args) throws IOException {
22        BufferedReader bufreader=
23                new BufferedReader(new FileReader("H:\\项目\\javaSE\\IO\\src\\com\\Lucky\\io\\BufferStream\\bufferTest.txt"));
24        BufferedWriter bufWriter=
25                new BufferedWriter(new FileWriter("H:\\项目\\javaSE\\IO\\src\\com\\Lucky\\io\\BufferStream\\charBufferTest.txt"));
26 
27 
28 
29 
30        String val;
31        while ((val=bufreader.readLine())!=null){  //结尾最后返回null
32            System.out.println(val);
33            bufWriter.newLine();   //换行【可以不同的系统中使用不用再使用\r\n】
34        }
35 
36 
37        //关闭流
38         bufWriter.close();
39         bufreader.close();
40     }
41 }

综合小练习:

练习一材料:

12.穿上婚纱让朋友见证我们
10.白头偕老是我一生宿愿
14.就让我给你一场想要的最美的婚礼
4.你我在调整着紧张的情绪
7.我想和你结婚做炙热的亲吻
8.我想和在这开始私定终身
1.嘉宾正准备着盛装出席
2.亲眼目睹这一浪漫的婚礼
3.红毯散满花瓣爱情在洋溢
9.香槟塔前许下了誓言
13.礼堂里营造出浪漫气息
11.我想和你结婚做最幸福的人
5.神圣的一刻开始记录珍惜
6.感谢这份爱你我都未缺席

package com.Lucky.io.BufferStream.test;

import java.io.*;
import java.util.*;

/**
 * 练习1:将sort.txt【顺序乱的】的数据排序输出到新的文件中【拷贝数据加排序】
 */
public class sort {
    public static void main(String[] args) throws IOException {
        //创建对象
//        BufferedInputStream in=
//                new BufferedInputStream(new FileInputStream("H:\\项目\\javaSE\\IO\\src\\com\\Lucky\\io\\BufferStream\\test\\sort.txt"));
        BufferedWriter out=
                new BufferedWriter(new FileWriter("H:\\项目\\javaSE\\IO\\src\\com\\Lucky\\io\\BufferStream\\test\\sortNew.txt"));
        BufferedReader bufreader=
                new BufferedReader(new FileReader("H:\\项目\\javaSE\\IO\\src\\com\\Lucky\\io\\BufferStream\\test\\sort.txt"));


        //////////////////解法一:ArrayList/////////////////////////////////
        byte[] arr=new byte[1024];
        String  val;
        ArrayList<String> li=new ArrayList<>();
        while ((val=bufreader.readLine())!=null){
            li.add(val);
        }
        //System.out.println(li);
        li.sort(new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                int min=Integer.parseInt(o1.split("\\.")[0]);
                int max=Integer.parseInt(o2.split("\\.")[0]);
                return min-max;
            }
        });
        System.out.println(li);

        //写出数据
        for (String s : li) {
            out.write(s);
            out.newLine();  //换行
        }


        //关闭流
        out.close();
        bufreader.close();



        //////////////////解法二:TreeMap自动排序/////////////////////////////////
//        TreeMap<Integer,String> map=new TreeMap<>();
//        while ((val=bufreader.readLine())!=null){
//            int i = Integer.parseInt(val.split("\\.")[0]);
//            map.put(i,val);
//        }
//        Set<Map.Entry<Integer, String>> entries = map.entrySet();
//        for (Map.Entry<Integer, String> entry : entries) {
//            String value = entry.getValue();
//            out.write(value);
//            out.newLine();
//        }
//
//        out.close();
//        bufreader.close();

    }
}

练习2材料:

testCount.txt文件的初始数据是 ---》  0

1 package com.Lucky.io.BufferStream.test;
 2 
 3 import java.io.*;
 4 
 5 /*
 6 练习2: 定义一个小程序,要求前面三次免费运行,第四次开始要提示开通会员使用
 7 
 8 注意点:字符流的读取/写出对象创建【如果指定相同的路径就注意】不要写到一起
 9        因为,在创建写出对象时,会将原来路径的内容清空
10  */
11 
12 /**
13  * 每天一个小知识: IO的使用原则:
14  *                          ★什么时候用就什么时候创建
15  *                          ★用完就立马关闭
16  */
17 public class SMG {
18     public static void main(String[] args) throws IOException {
19         //创建读取文件对象
20         BufferedReader reader=
21                 new BufferedReader(new FileReader("H:\\项目\\javaSE\\IO\\src\\com\\Lucky\\io\\BufferStream\\test\\testCount.txt"));
22         //获取行数据
23         String s = reader.readLine();
24         //类型转换
25         int i = Integer.parseInt(s);
26         i++;
27         reader.close();
28         //判断次数
29         if(i<4){
30             System.out.println("运行了"+i+"次");
31         }else {
32             System.out.println("本次第"+i+"运行,只能免费运行"+"3次");
33         }
34 
35         //创建写出对象
36         BufferedWriter writer=
37                 new BufferedWriter(new FileWriter("H:\\项目\\javaSE\\IO\\src\\com\\Lucky\\io\\BufferStream\\test\\testCount.txt"));
38        //将新的值写出到文件中
39         writer.write(i+"");
40         writer.close();
41 
42     }
43 }