发布时间:2022-12-10 文章分类:编程知识 投稿人:赵颖 字号: 默认 | | 超大 打印

缓冲流,也叫高效流,是对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 }