IO流(三)高级流——>缓冲流

3、高级流

高级流都是对基本流的包装,即高级流需要关联基本流

(1)缓冲流

---1、字节缓冲流
原理: 底层自带了长度为8192的缓冲区提高性能
字节缓冲流常用的方法

Public BufferedInputStream(InputStream is) 把基本流包装成高级流,提高读取数据的性能

Public BufferedOutputStream(OutputStream os) 把基本流包装成高级流,提高写出数据的性能

(1)练习:利用字节缓冲流拷贝文件
java 复制代码
import java.io.*;

public class BufferedStreamDemo1 {
    public static void main(String[] args) throws IOException {
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("opp-IO\\a.txt"));
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("opp-IO\\c.txt"));
        //一次读取一个字节
//        int b;
//        while ((b = bis.read()) != -1) {
//            bos.write(b);
//        }
       //一次读取多个字节
        int len;
        byte[] bytes = new byte[1024];
        while ((len = bis.read(bytes)) != -1) {
            bos.write(bytes, 0, len);
        }
        bos.close();
        bis.close();
    }
}
(2)字节缓冲流提高效率的原理
---2、字符缓冲流
(1)字符缓冲流特有方法
原理: 底层自带了长度为8192的缓冲区提高性能( 注意: 字符流本身已经带有缓冲区了)
字符缓冲流构造方法

Public BufferedReader(Reader r) 把基本流变成高级流

Public BufferedWriter(Writer r) 把基本流变成高级流

字符缓冲流特有的方法

(1)字符缓冲输入流特有方法

Public ``String`` readLine() 读取一行数据(遇到\r\n才停止)如果没有数据可读了,会返回null

细节: readLine方法在读取数据的时候,一次读一行,遇到回车换行结束 但是它不会把回车换行读到内存当中(所以拷贝时,如果有换行,需调用newLine方法);

(2)字符缓冲输出流特有方法

Public void newLine() 跨平台的换行

注:该方法底层会自动判断是什么系统,对应不同的换行

这两个特有方法可以让读取拷贝的效率更高

java 复制代码
import java.io.*;

public class BufferedStreamDem2 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new FileReader("opp-IO\\a.txt"));
        BufferedWriter bw = new BufferedWriter(new FileWriter("opp-IO\\c.txt"));
    /*读取数据
        细:1:readLine方法在读取数据的时候,一次读一行,遇到回车换行结束
               但是它不会把回车换行读到内存当中(所以拷贝时,如果有换行,需调用newLine方法);
        细节2:该方法返回的是String,所以循环读取时,终止条件为null
     */
//        String line1 = br.readLine();
//        System.out.println(line1);
//        String line2 = br.readLine();
//        System.out.println(line2);
        String line;
        while ((line = br.readLine()) != null) {
            System.out.println(line);
            bw.write(line);
            bw.newLine();
        }
        bw.close();
        br.close();
    }
}
---3、缓冲流为什么能提高效率
  • 缓冲流自带长度8192的缓冲区

  • 可以显著提高字节流的读写性能

  • 对于字符提升不明显,对于字符缓冲流而言关键点是两个特有的方法

---4、缓冲流的练习
(1)四种拷贝方式的效率对比
(2)控制软件运行次数
java 复制代码
package BufferedStream;
import java.io.*;
public class Text {
    public static void main(String[] args) throws IOException {
        /*1.只开读,读取数据,因为输出流当开写时如果文件存在,则清空文件
          而,此时要当你readLine读文件时,文件为空,会出现异常
        规则:
            IO流:什么时候用,什么时候创建,什么时候不用,什么时候关闭
        */
        BufferedReader br = new BufferedReader(new FileReader("opp-IO\\a.txt"));
        String line = br.readLine();
        br.close();//读完立刻关闭读流!!

        int count = Integer.parseInt(line);
        count++;
        if(count <= 3) {
            System.out.println("欢迎使用本软件,第" + count + "次使用免费~");
        }else {
            System.out.println("本软件只能免费使用3次,欢迎注册会员后继续使用~");
        }

        //2.读完再开写,覆盖重写文件,不会提前清空
        BufferedWriter bw = new BufferedWriter(new FileWriter("opp-IO\\a.txt"));
        bw.write(count + "");
        bw.close();
    }
}

(2)转换流