字節流緩沖區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;
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();
}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 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原理之裝飾模式