码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2018-01-25 14:12:36      阅读:154      评论:0      收藏:0      [点我收藏+]

标签:shu   null   自动   ++   文件的   缓冲区   强制转换   auth   str   

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原理之装饰模式

标签:shu   null   自动   ++   文件的   缓冲区   强制转换   auth   str   

原文地址:http://blog.51cto.com/13579086/2064989

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!