IO——缓冲流

一、缓冲流

1.为了提高数据读写的速度,Java API提供了带缓冲功能的流类,在使用这些流类时,会创建一个内部缓冲区数组,缺省使用8192个字节(8Kb)的缓冲区。

2.缓冲流要“套接”在相应的节点流之上,根据数据操作单位可以把缓冲流分为:
BufferedInputStream 和 BufferedOutputStream,BufferedReader 和 BufferedWriter

3.当读取数据时,数据按块读入缓冲区,其后的读操作则直接访问缓冲区。
当使用BufferedInputStream读取字节文件时,BufferedInputStream会一次性从文件中读取8192个(8Kb),存在缓冲区中,直到缓冲区装满了,才重新从文件中读取下一个8192个字节数组。

4.向流中写入字节时,不会直接写到文件,先写到缓冲区中直到缓冲区写满,BufferedOutputStream才会把缓冲区中的数据一次性写到文件里。使用方法flush()可以强制将缓冲区的内容全部写入输出流。

5.关闭流的顺序和打开流的顺序相反。只要关闭最外层流即可,关闭最外层流也会相应关闭内层节点流。

6.如果是带缓冲区的流对象的close()方法,不但会关闭流,还会在关闭流之前刷新缓冲区,关闭后不能再写出。

二、代码实践

使用 BufferedInputStream /BufferedOutputStream对字节型文件进行输入输出

public class Buffered {
    public static void main(String[] args) {
        try {
            FileOutputStream fos = new FileOutputStream("imooc.txt");
            BufferedOutputStream fis = new BufferedOutputStream(fos);
            FileInputStream fio = new FileInputStream("imooc.txt");
            BufferedInputStream foi = new BufferedInputStream(fio);
            //这里调用的b是一个byte的数组
            //如果缓冲区没满的时候,这里的write不会自动执行,需调用flush()
            long startTime=System.currentTimeMillis();//计算时间
            fis.write(50);
            fis.write('a');
            fis.flush();//强制清理缓冲区
            //输出文件的内容
            System.out.println(foi.read());
            System.out.println((char)foi.read());
            long endTime= System.currentTimeMillis();
            System.out.println(endTime-startTime);
             //先关闭外层的流,再关闭内层的流,外层关闭的时候也会关闭内层的流,所以可以省略
            fis.close();
            foi.close();
            } catch (FileNotFoundException e) {
            e.printStackTrace();
        }catch (IOException e) {
            e.printStackTrace();
        }
    }
}

使用InputStreamReader/OutputStreamWriter对字符型文本文件进行复制

//字节字符转换流
public class ReaderWriter {
    public static void main(String[] args) {
        try {
        //先在创建imooc.txt文件,保存字符型数据
            FileInputStream fis = new FileInputStream("imooc.txt");
            InputStreamReader fos = new InputStreamReader(fis);
            FileOutputStream srw = new FileOutputStream("imooc1.txt");
            OutputStreamWriter nrw = new OutputStreamWriter(srw);
            //输出到控制台
            int n =0;
            char[] cubf = new char[10];
           //while (((n=fos.read())!=-1)){
             //  System.out.print((char) n);
           //}
            //第二种输出方法
            /*while ((n=fos.read(cubf))!=-1){
                String s = new String(cubf,0 ,n);//从字符数组的零号下标开始读取,读取n长度的字符
                System.out.print(s);
            }*/
            while ((n=fos.read(cubf))!=-1){
                nrw.write(cubf,0,n);
                nrw.flush();
            }
            fos.close();
            nrw.close();
            } catch (FileNotFoundException e) {
            e.printStackTrace();
        }catch (IOException e) {
            e.printStackTrace();
        }
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值