缓冲流
缓冲流是一种高级流,可以理解为将基本流包装成了这种高级流,而这种高级流的特点就是将一个缓冲区放入到基本流当中,从而提高基本流的效率,但实际进行读写操作的还是基本流
下面为缓冲字节输出流和缓冲字节输入流的应用,将a文件的数据拷贝到b文件中
package com.itazhang.Demo1;import java.io.*;public class BufferStreamDemo1 {public static void main(String[] args) throws IOException {BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\11Codingtext\\MyIO\\a.txt"));BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:\\11Codingtext\\MyIO\\b.txt"));int temp;while(true){temp = bis.read();if(temp == -1){break;}bos.write(temp);}bos.close();bis.close();}
}
其实可以将缓冲区理解为一个候车室,所有需要读取或者写入的数据放入固定长度的缓冲区内,需要进行读取或者写出的时候直接从该数组中拿取就行,缓冲区其实就是底层默认创建了一个8192长度的数组,而在进行read操作时候创建的数组相当于是排队的入口,如果不创建数组进行read的话,相当于只开放了一个入口,创建lenth长度的数组的话,相当于一次性开放了lenth长度个入口
在缓冲字节输入流的read时,同样也能创建一个数组用来存储每一次read的数据
下面是一个字节缓冲流的拷贝代码具体实现:
package com.itazhang.Demo1;import java.io.*;public class BufferStreamDemo1 {public static void main(String[] args) throws IOException {BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\11Codingtext\\MyIO\\a.txt"));BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:\\11Codingtext\\MyIO\\b.txt"));int temp;byte[] brr = new byte[1024];while(true){temp = bis.read(brr);if(temp == -1){break;}bos.write(brr,0,temp);}bos.close();bis.close();}
}
字符缓冲输入流
创建方法与字节缓冲输入流类似,用字符缓冲输入流去包裹字符输入流
BufferedReader bf =new BufferedReader(new FileReader("D:\\11Codingtext\\MyIO\\a.txt"));
字符缓冲输入流除了他自带的缓冲区,还有一个其独特的方法也就是可以一次只读一行的方法
bf.readLine();
这个方法能只读取文件里的一行数据,实现代码如下
package com.itazhang.Demo1;import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;public class BufferedCharStreamDemo1 {public static void main(String[] args) throws IOException {BufferedReader bf =new BufferedReader(new FileReader("D:\\11Codingtext\\MyIO\\a.txt"));//BufferedReader特有的方法,只读取一行数据readlineString temp;while(true){temp = bf.readLine();if(temp == null){break;}System.out.println(temp);}}
}
字符缓冲输出流
该流创建方式也是bufferedwriter将基础的字符输出流Filewriter包裹,如下
BufferedWriter bw =new BufferedWriter(new FileWriter("D:\\11Codingtext\\MyIO\\b.txt"));
该流也有一个独特的输出方法,也就是换行,他有一个newline方法能在输出的时候将数据换行,也是字符缓冲输出流所特有的方法,具体代码如下:
package com.itazhang.Demo1;import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;public class BufferedCharStreamDemo2 {public static void main(String[] args) throws IOException {BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\11Codingtext\\MyIO\\b.txt"));bw.write("我是一个测试语句");bw.newLine();bw.write("看看我换行了吗");bw.newLine();bw.close();}
}
字符缓冲流练习
需求:将a文件里的数据通过每个字符串开头的数字,从小到大排序复制到b文件中,具体实现代码如下:
1、使用list集合存储读取的数据,并将数据通过list的sort方法进行排序,最后再写入b文件
package com.itazhang.Demo1;import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;public class Exercise2 {public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new FileReader("D:\\11Codingtext\\MyIO\\a.txt"));BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\11Codingtext\\MyIO\\b.txt"));ArrayList<String> list = new ArrayList<>();//读取数据存入集合String temp;while (true){temp = br.readLine();if(temp == null){break;}Collections.addAll(list,temp);}//利用list集合进行排序Collections.sort(list, new Comparator<String>() {@Overridepublic int compare(String o1, String o2) {int i1 = Integer.parseInt(o1.split("\\.")[0]);int i2 = Integer.parseInt(o2.split("\\.")[0]);return i1- i2;}});//写出数据到指定文件for (String s : list) {bw.write(s);bw.newLine();}bw.close();br.close();}
}
2、使用TreeMap存储读取出来的数据,TreeMap会自动将存储的数据排序,这样就可以直接通过获取键值对再获取对应键值对的值从而将其写入b文件,具体实现代码如下
package com.itazhang.Demo1;import java.io.*;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;public class Exercise2Demo2 {public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new FileReader("D:\\11Codingtext\\MyIO\\a.txt"));//创建TreeMap集合存储读取的数据,TreeMap自动将数据排序TreeMap<Integer,String> tm = new TreeMap<>();String temp;while(true){temp = br.readLine();if(temp == null){break;}tm.put(Integer.parseInt(temp.split("\\.")[0]),temp.split("\\.")[1]);}//使用entrySet将键值对取出,使用getValue方法取出对应值写入到指定文件BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\11Codingtext\\MyIO\\b.txt"));Set<Map.Entry<Integer, String>> entrySet = tm.entrySet();for (Map.Entry<Integer, String> entry : entrySet) {bw.write(entry.getValue());bw.newLine();}bw.close();br.close();}
}
字符缓冲流练习 (二)
确定一个程序执行的次数,如果前三次就提示正常使用,第四次开始提示三次免费试用已完。
这个需求显然不能将count计数器写入程序中,因为程序每次运行的时候会初始化count,这样达不到每次程序运行时count++的目的,所有将count写入文件中才是正确的写法,如下:
package com.itazhang.Demo1;import java.io.*;public class Exercise3 {public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new FileReader("D:\\11Codingtext\\MyIO\\c.txt"));//读取数据int i = Integer.parseInt(br.readLine());i++;//进行判断使用次数是否超过3if(i<=3){System.out.println("这是第"+ i +"次使用,这次是正常使用");}else{System.out.println("这是第"+i+"次使用,已经超过使用限制");}BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\11Codingtext\\MyIO\\c.txt"));bw.write((String) (i+""));bw.close();br.close();}
}