标签:shu null 自动 ++ 文件的 缓冲区 强制转换 auth str
import java.io.BufferedInputStream;/**
*/
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