Java基础-BufferedInputSream以及BufferedOutputStream

在之前的FileInputSream以及FileOutputStream不带缓冲的操作,也就是每读入一个字节或数组就要写入,由于涉及磁盘的IO操作相比内存的操作要慢的的多,所以不带缓冲的流效率很低。带缓冲的流,可以一次读很多字节,但不向磁盘中写入,只是先放到内存里。等凑够了缓冲区大小的时候一次性写入磁盘,这种方式可以减少磁盘操作次数,速度就会提高很多!下面我们就来了解一下缓冲字节流的。

BuferedInputSream 字节缓冲输入流

构造方法

  • BufferedInputStream(InputStream in)
    创建一个 BufferedInputStream和保存它的参数,输入流 in,供以后使用.
    *BufferedInputStream(InputStream in, int size) --不常用
    创建一个具有指定的缓冲区大小 BufferedInputStream,并保存它的参数,输入流 in,供以后使用。

常用方法

  • int read()
    看到的 InputStream的 read方法一般相同。 从输入流读取下一个数据字节。字节的值范围在 0到 255一 int返回。如果没有可用的字节,因为已到达流的末尾,则返回值 -1。此方法块,直到输入数据可用,流的结束被检测到,或抛出异常。
  • int read(byte[] b, int off, int len)
    从这个字节的输入流读取到指定的字节数组中的字节,从给定的偏移量开始。 如果基础流的第一 read返回 -1表示文件结束之后这个方法返回 -1。否则,此方法返回实际读取的字节数。
  • void close()
    关闭此输入流并释放与流关联的任何系统资源。

BuferedOutputStream 字节缓冲输出流

关键字段

protected byte[] buf; //内置缓存字节数组、用于存放程序要写入out的字节

protected int count; //内置缓存字节数组中现有字节总数

构造函数

  • BufferedOutputStream(OutputStream out); //使用默认大小、底层字节输出流构造bos。默认缓冲大小是 8192 字节( 8KB )
  • BufferedOutputStream(OutputStream out, int size); //使用指定大小、底层字节输出流构造bos

常用方法

void flush(); 将写入bos中的数据flush到out指定的目的地中、注意这里不是flush到out中、因为其内部又调用了out.flush()
write(byte b); 将一个字节写入到buf中
write(byte[] b, int off, int len); 将b的一部分写入buf中
BufferedOutputStream没有自己的close方法,当他调用父类FilterOutputStrem的方法关闭时,会间接调用自己实现的flush方法将buf中残存的字节flush到out中。
查看BufferedOutputStream的源代码,发现所谓的buffer其实就是一个byte[]。
BufferedOutputStream的每一次write其实是将内容写入byte[],当buffer容量到达上限时,会触发真正的磁盘写入。
而另一种触发磁盘写入的办法就是调用flush()了。

注意

1.BufferedOutputStream在close()时会自动flush
2.BufferedOutputStream在不调用close()的情况下,缓冲区不满,又需要把缓冲区的内容写入到文件或通过网络发送到别的机器时,才需要调用flush.

实战构建-赋值文本文件

 public static void BufferIntOutStreamDemoTest(){
        BufferedInputStream bufferedInputStream = null ;
        BufferedOutputStream bufferedOutputStream = null ;
        try{
             bufferedInputStream = new BufferedInputStream(new FileInputStream(".\\src\\IntOutTest\\luo.txt"));
             bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(".\\src\\IntOutTest\\luocopy.txt")) ;
             byte[] bytes = new byte[1024];// 一次读取一个字节
            int length = 0;// 实际读取数
            while ((length =bufferedInputStream.read(bytes))!= -1){

                bufferedOutputStream.write(bytes);
            }

        }catch (FileNotFoundException fileNotFoundException){
            fileNotFoundException.printStackTrace();
        }catch (IOException ioException){
            ioException.printStackTrace();
        }finally {
            if (bufferedOutputStream != null& bufferedInputStream != null) {
                try {
                    bufferedOutputStream.close();
                    //fileOutputStrea.close();
                    bufferedInputStream.close();
                    //fileInputStream.close();

                } catch (IOException ioException) {
                    ioException.printStackTrace();
                }
            }
        }
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值