黑马程序员技术交流社区
标题:
高手求助,为什么用自定义字节流缓冲区来复制图片不全
[打印本页]
作者:
潜伏
时间:
2013-11-27 23:17
标题:
高手求助,为什么用自定义字节流缓冲区来复制图片不全
/*
要求:自定义字节流中的缓冲区
思路:
1,
*/
import java.io.*;
class Huanchongqu
{
public static void main(String[] args) throws Exception
{
MyBufferedInputStream bi=new MyBufferedInputStream(new FileInputStream("ga.jpg"));
BufferedOutputStream in=new BufferedOutputStream(new FileOutputStream("ha.jpg"));
int num=0;
while((num=bi.myread())!=-1)
{
in.write(num);
}
}
}
class MyBufferedInputStream
{
private FileInputStream in;
MyBufferedInputStream(FileInputStream in)
{
this.in=in;
}
byte[] arr=new byte[1024];
int pos=0;
int count=0;
public int myread()throws Exception
{
if(count==0)
{
pos=0;
count=in.read(arr);
count--;
return arr[0]&255;// 此处是强转,将byte型转换为int型,在将
}
if(count>0)
{
pos++;
count--;
return arr[pos]&255;
}
return -1;
}
}
作者:
衣带赞
时间:
2013-11-28 00:26
本帖最后由 衣带赞 于 2013-11-28 00:32 编辑
看了好久,终于发现你的2处错误,第一是没刷新,第二是返回有问题。给你在代码中作了注释,你看看就懂了。
import java.io.*;
class Huanchongqu
{
public static void main(String[] args) throws Exception
{
MyBufferedInputStream bi=new MyBufferedInputStream(new FileInputStream("ga.jpg"));
BufferedOutputStream in=new BufferedOutputStream(new FileOutputStream("ha.jpg"));
int num=0;
while((num=bi.myread())!=-1)
{
in.write(num);
in.flush(); /*没刷新,找了好久,经过测试发现这个系统自定义的字节数组大小是64k,
和udp协议传输的最大包一样大,你传个小于64k的图片就不会丢失数据。
所以当超过64k后会继续往里面添加内容,就会覆盖前面的一些数据。
据我估计,当覆盖的数据超过一定大小,会自动刷新一次,所以每次复制都会变少。*/
}
in.close(); //最好关流,习惯成自然
}
}
class MyBufferedInputStream
{
private FileInputStream in;
MyBufferedInputStream(FileInputStream in)
{
this.in=in;
}
byte[] arr=new byte[1024];
int pos=0;
int count=0;
public int myread()throws Exception
{
if(count==0)
{
pos=0;
count=in.read(arr);
if(count==-1) //这里少了两局话,当没有数据后count=-1,
//然后count-- return -2 & 255 , 多出了一个字节
return -1;
count--;
return arr[0]&255;// 此处是强转,将byte型转换为int型,在将
}
if(count>0)
{
pos++;
count--;
return arr[pos]&255;
}
return -1;
}
}
复制代码
作者:
简★零度
时间:
2013-11-30 20:33
问题解决了就把类型改成提问结束1
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2