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