黑马程序员技术交流社区
标题:
自定义字节流问题
[打印本页]
作者:
韩俊杰
时间:
2013-1-11 20:45
标题:
自定义字节流问题
本帖最后由 韩俊杰 于 2013-1-14 12:47 编辑
package io;
import java.io.*;
class MyBufferedInputStream{
private InputStream in;
private byte[] buf=new byte[1024];
private int pos=0,count=0;
MyBufferedInputStream(InputStream in){
this.in=in;
}
//一次读一个字节,从缓冲区(字节数组)获取
public int myRead()throws IOException{
//通过in对象读取硬盘上的数据,并存储到buf中
if(count==0){
count=in.read(buf);
if(count<0)
return -1;
pos=0;
byte b=buf[pos];
count--;
pos++;
return b&255;
}else if(count>0){
byte b=buf[pos];
count--;
pos++;
return b&0xff;
}
return -1;
}
public void myClose()throws IOException{
in.close();
}
}
public class CopyMp3Demo {
public static void main(String[] args)throws IOException {
long start=System.currentTimeMillis();
copy();
long end=System.currentTimeMillis();
System.out.println((end-start)+"毫秒");
}
//通过字节流缓冲区进行复制
public static void copy()throws IOException{
MyBufferedInputStream bis=new MyBufferedInputStream(new FileInputStream("1.mp3"));
BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("2.mp3"));
int ch=0;
while((ch=bis.myRead())!=-1){
bos.write(ch);
}
bis.myClose();
bos.close();
}
}
复制代码
b&255,为什么b&255拷贝图片就成功了?请各位大神指点
作者:
黑马吕世成
时间:
2013-1-13 02:41
因为此时b的二进制值不等于负一啊。之所以返回一个int值,就是为了避免对到的字节刚好对应的值为负一,而导致读去数据失败。能明白不?毕老师视频也有讲到这个。
作者:
夏晓彤
时间:
2013-1-14 00:38
因为字节文件可能出现1111-1111的情况 //1111-1111十进制是-1
因为b是byte类型的,被提升为int类型的//public int myRead()
所以变为1111-1111-1111-1111-1111-1111-1111-1111,为了避免1111-1111前补1带来的影响,
所以 &0000—0000—0000—0000—0000—0000—1111-1111//十进制255,
所以就避免了做错误判断。
作者:
韩俊杰
时间:
2013-1-14 12:48
知道了,谢谢各位大神,还需要继续努力
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2