1. 程式人生 > >字節流緩沖區BufferedInputStream原理之裝飾模式

字節流緩沖區BufferedInputStream原理之裝飾模式

問題 throws 方法 思考 字節 run extend main err

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原理之裝飾模式