缓冲流 字节缓冲流: 字节输入缓冲流:BufferedInputStream 字节输出缓冲流:BufferedOutputStream 字符缓冲流: 字符输入缓冲流:BufferedReader 字符输出缓冲流:BufferedWriter 缓冲流特点是快,因为内部有一个缓冲区,可以提高效率。 缓冲流其实本身并不具备读或者写的功能,它的作用其实是为其他流加速。 缓冲流的使用步骤(和我们昨天学的流一样): 1. 创建一个缓冲流对象。 2. 调用read方法读或者调用write方法写。 3. 释放资源。 字节缓冲流的构造方法 BufferedInputStream(InputStream in):参数需要传递字节输入流。 BufferedOutputStream(OutputStream out): 参数需要传递字节输出流。 使用缓冲流完成文件的复制 //110ms */ public class Demo02BufferedStream { public static void main(String[] args) throws IOException { //创建字节缓冲输入流用来读取 BufferedInputStream bis = new BufferedInputStream(new FileInputStream("E:\\就业班代码\\day010\\src\\cn\\itcast\\demo01_bufferedstream\\bb.jpg")); //创建字节缓冲输出流用来写入 BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("E:\\就业班代码\\day010\\src\\cn\\itcast\\demo01_bufferedstream\\cc.jpg")); //当前时间 long start = System.currentTimeMillis(); int len; while ((len = bis.read()) != -1) { bos.write(len); } long end= System.currentTimeMillis(); System.out.println(end-start);//110ms bis.close(); bos.close(); } }
/* 使用缓冲流一次读写一个字节数组的方式复制文件 10ms */ public class Demo03BufferedStream { public static void main(String[] args) throws IOException { //1创建一个BufferedInputStream BufferedInputStream bis = new BufferedInputStream(new FileInputStream("bb.jpg")); //2 创建一个BufferedOutPutStream用来接收复制来的图片 BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("E:\\就业班代码\\day010\\src\\cn\\itcast\\demo01_bufferedstream\\aa.jpg")); //创建一个字节数组用来高效复制 byte arr[] = new byte[1024 * 8]; int ien; //一次复制一个数组,ien为读取到的长度 long start = System.currentTimeMillis(); while ((ien = bis.read(arr)) != -1) { bos.write(arr, 0, ien); } long end = System.currentTimeMillis(); System.out.println(end - start);//15ms }
/* 字符缓冲流: 字符输出缓冲流: BufferedWriter 字符输入缓冲流: BufferedReader 字符缓冲流本身也不具备读或者写的功能,它的作用是为其他流提供加速。 使用步骤和昨天学的基本的字符流基本一致。 步骤 1. 创建缓冲流对象 2. 调用write方法写或者调用read方法读。 (读或者写的方法和昨天学的一样) 3. 刷新(字符流写的时候要刷新, 读的时候不需要刷新) 4. 释放资源 字符缓冲流的构造方法: BufferedWriter(Writer out):传递一个字符输出流。 BufferedReader(Reader in): 传递一个字符输入流 */ import java.io.*; public class Demo01BufferedStream { public static void main(String[] args) throws IOException { method1(); method2(); } public static void method2() throws IOException { //创建一个字符缓冲输入流对象 BufferedReader br = new BufferedReader(new FileReader("file01.txt")); //调用read方法,进行读取。 //一次读取一个字符 /* int i; while ((i = br.read()) != -1) { System.out.print((char) i); } */ //一次读取一个字符数组 char[] cArr = new char[1024]; int len; while((len = br.read(cArr)) != -1) { System.out.print(new String(cArr, 0, len)); } //释放资源 br.close(); } //使用字符缓冲流向文件中写数据 public static void method1() throws IOException { //创建一个字符缓冲输出流对象 BufferedWriter bw = new BufferedWriter(new FileWriter("file01.txt")); //调用方法,写数据 bw.write("你好,你今天早上做头发了吗"); //刷新 bw.flush(); //释放资源 bw.close(); } }
/* 字符缓冲流中独有的方法(重要) BufferedWriter中有一个方法,可以实现一个跨平台的换行。 void newLine() BufferedReader中有一个方法,可以每次读取一行数据。 String readLine(): 读取一行数据。返回值是读取到的这行数据。如果读取结束,返回null readLine方法不会读取换行符,如果要换行,需要我们手动实现 */ public class Demo02BufferedStream { public static void main(String[] args) throws IOException { method2(); } public static void method2() throws IOException { //创建字符缓冲输入流 BufferedReader br=new BufferedReader(new FileReader("E:\\就业班代码\\day010\\src\\cn\\itcast\\demo02buffered_stream\\aa.txt")); //读取一行数据 String s = br.readLine(); String s1 = br.readLine(); System.out.println(s+"\\r\n"+s1); br.close(); } public static void method1() throws IOException { //创建缓冲输出流 FileWriter fw=new FileWriter("E:\\就业班代码\\day010\\src\\cn\\itcast\\demo02buffered_stream\\aa.txt"); BufferedWriter bw=new BufferedWriter(fw); bw.write("江南好曾经旧曾谙"); bw.newLine(); bw.write("日出江花红胜火"); bw.flush(); bw.close(); } }
/* 给出师表中的内容恢复顺序。 文件中内容的特点: 1. 内容是 序号.语句 2. 序号是唯一的不重复的 思路: 1. 定义一个Map集合, key为序号,value为后面的内容 2. 创建一个字符缓冲输入流,用来读取 3. 开始读,一次读取一行数据。 4. 每读取到一行数据,那么就根据.进行切割,得到这句话的序号以及内容。 5. 把序号作为key,把内容作为value放入到Map集合。 6. 创建一个输出流,用来写 7. 使用循环,从1开始,最大的Map集合的长度。根据数字获取对应的value。 8. 把这些内容使用.分隔写入到新的文件中 9. 换行 10. 刷新 11. 关流 */ public class Demo03BufferdStream { public static void main(String[] args) throws IOException { //定义一个map集合,key为序号,value为后面的内容 Map<Integer, String> mp = new HashMap<>(); //创建字符缓冲输入流读取一行 BufferedReader br = new BufferedReader(new FileReader("F:\\黑马就业\\day10\\代码\\day10\\出师表.txt")); String line;///3. 开始读,一次读取一行数据 while ((line = br.readLine()) != null) { String[] split = line.split("\\."); //line里面保存的就是读取到的这行数据 //4. 每读取到一行数据,那么就根据.进行切割,得到这句话的序号以及内容。 //split方法是根据正则表达式切割。 而.是正则表达式的特殊字符。 所以需要转义 Integer key = Integer.parseInt(split[0]); //数组中索引为0的元素是 序号。 数组中索引为1的元素是内容 String value = split[1]; //5. 把序号作为key,把内容作为value放入到Map集合。 mp.put(key, value); } //释放资源 br.close(); //创建一个输出流用来写 BufferedWriter bw = new BufferedWriter(new FileWriter("E:\\就业班代码\\day010\\src\\cn\\itcast\\demo02buffered_stream\\chushibiao.txt")); //使用循环,从1开始,最大到map集合的长度,根据序号获取对应的value for (int i = 1; i <= mp.size(); i++) { String s = mp.get(i); //8. 把这些内容使用.分隔写入到新的文件中 bw.write(i + "." + s); bw.flush(); bw.newLine(); } //释放资源 bw.close(); } }