字节流缓冲区BufferedInputStream原理之装饰模式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字节流缓冲区BufferedInputStream原理之装饰模式相关的知识,希望对你有一定的参考价值。

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

/**

  • @author WangShuang
  • */
    public class Demo {

    public static void main(String[] args) {
    MyBufferedInputStream in = null;
    BufferedOutputStream out = null;
    try {
    in = new MyBufferedInputStream(new FileInputStream("c:\my.avi"));
    out=new BufferedOutputStream(new FileOutputStream("d:\my.avi"));
    int ch=0;
    while((ch = in.read())!=-1){//in.read() 是从缓冲区中取
    out.write(ch);//只写出最低8位
    }
    } catch (Exception e) {
    e.printStackTrace();
    throw new RuntimeException("读取错误");
    }finally{
    try {
    if(in!=null){
    in.close();
    }
    } catch (Exception e2) {
    e2.printStackTrace();
    }
    try {
    if (out!=null) {
    out.close();
    }
    } catch (Exception e2) {
    e2.printStackTrace();
    }
    }
    }
    }
    class MyBufferedInputStream extends InputStream{
    private InputStream inputStream;
    private byte buffered[] = new byte[1024];//缓冲区
    private int pos;//指针
    private int count;//计数器
    public MyBufferedInputStream(InputStream inputStream){
    this.inputStream = inputStream;
    }

    @Override
    public int read() throws IOException {
    if(count==0){
    pos=0;
    count= inputStream.read(buffered);//调用inputstream的read方法从硬盘中读数据并存到缓冲区中 ,返回值

为读到的个数
if(count <0){
return -1;
}
byte b = buffered[pos];
pos++;
count--;
return b&255;//byte可以自动转型为int
}else if(count>0){
byte b = buffered[pos];
pos++;
count--;
return b&255;
}
return -1;
}
}
/*思考 为了返回值用int而不用byte呢?
MP3在内存中就是二进制11111111-11111111100000000000000001000101010
当遇到11111111时 byte转int变成11111111-11111111-11111111-11111111转成十进制是-1和判断结束标记-1相同

为了解决这个问题
前面不要补1补0既可以保证原字节数不变又可以避免-1的出现 那么该怎么弄呢?其实也就是取二进制的最低8位 &上十进制255
00000000-00000000-00000000-11111111
00000000-00000000-00000000-11111111
00000000-00000000-00000000-11111111

继续思考:
BufferInputStream.write(int a)
为什么不是原文件的4倍
因为在write的内部进行了只取最低8位的处理,强制转换
*

以上是关于字节流缓冲区BufferedInputStream原理之装饰模式的主要内容,如果未能解决你的问题,请参考以下文章

IO流学习之字节流

IO流23 - 字节流 - 字节输出流的缓冲流以及字节输入流的缓冲流BufferedOutputStream&BufferedInputStream

70. SequenceInputStream(文件合并)

文件的复制方式

字节流复制文件和字节缓冲流复制文件的时间比较

字节流与字符流复习