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