FileOutputStream:
void write(byte[] b, int off, int len)
将指定字节数组中从偏移量 off 开始的 len 个字节写入此文件输出流。
FileInputStream:
int read(byte[] b, int off, int len)
从此输入流中将最多 len 个字节的数据读入一个字节数组中。
--------------------------------------------------------------------
对于上面的方法,我有很深的误解(误解在于:off )!!!
现在拿一个简单例子来讲!获得一个文件,然后再写出。FileInputStream in=new FileInputStream("c:\\1.gif");
FileOutputStream out=new FileOutputStream("c:\\2.gif");
byte [] by=new byte[40];
int len;
while((len=in.read(by))!=-1){
out.write(by,0,len);//问题!
}
}
out.close();
in.close();
描述:
我做了一个byte缓冲器,大小40(因为原文件大小是57,所以我给他小点,想让他跑两次while,如果给他大于57,他一次就可以写完!)
进入循环:
第一次写:by这个缓冲器返回长度40,然后out.write(by,0,40);
第二次写:by这个缓冲器返回长度17,然后out.write(by,0,40);
在绿色的 0地方。我错误的想法是,他会掉到文件头去了。然后覆盖!结果是没有!
(
在这里,他是不是按当前在40,然后从40开始写,你给写的0代表从什么开始?(高手回答:问题:1)
)好。当然是我上现的猜想,我改了off
out.write(by,2,len);
我把他改成2,在第一次循环中,他写到40,然后应该是从42开始写,其中41就掉了一个字节!(问题2:为什么不会出错)
void write(byte[] b, int off, int len)
将指定字节数组中从偏移量 off 开始的 len 个字节写入此文件输出流。
FileInputStream:
int read(byte[] b, int off, int len)
从此输入流中将最多 len 个字节的数据读入一个字节数组中。
--------------------------------------------------------------------
对于上面的方法,我有很深的误解(误解在于:off )!!!
现在拿一个简单例子来讲!获得一个文件,然后再写出。FileInputStream in=new FileInputStream("c:\\1.gif");
FileOutputStream out=new FileOutputStream("c:\\2.gif");
byte [] by=new byte[40];
int len;
while((len=in.read(by))!=-1){
out.write(by,0,len);//问题!
}
}
out.close();
in.close();
描述:
我做了一个byte缓冲器,大小40(因为原文件大小是57,所以我给他小点,想让他跑两次while,如果给他大于57,他一次就可以写完!)
进入循环:
第一次写:by这个缓冲器返回长度40,然后out.write(by,0,40);
第二次写:by这个缓冲器返回长度17,然后out.write(by,0,40);
在绿色的 0地方。我错误的想法是,他会掉到文件头去了。然后覆盖!结果是没有!
(
在这里,他是不是按当前在40,然后从40开始写,你给写的0代表从什么开始?(高手回答:问题:1)
)好。当然是我上现的猜想,我改了off
out.write(by,2,len);
我把他改成2,在第一次循环中,他写到40,然后应该是从42开始写,其中41就掉了一个字节!(问题2:为什么不会出错)
第一次写:by这个缓冲器返回长度40,然后out.write(by,0,40);
第二次写:by这个缓冲器返回长度17,然后out.write(by,0,17);上面是17,写错了
第二次缓冲的话,应该是从41开始,一直写到57,共17个字节2:
我测试的问题2是报错的,java.lang.IndexOutOfBoundsException,明显越界了,
偏移为2 len仍然为40,当然不对
我知道的是这个out对象没被关闭,那么它对外写文件就不会自动覆盖前面写出去的内容,而是跟在后面继续写
可能是写代码不一样。我写给你FileInputStream in=new FileInputStream("c:\\1.gif");
FileOutputStream out=new FileOutputStream("c:\\2.gif");
byte [] by=new byte[40];
int len;
while((len=in.read(by))!=-1){
if(len==17)
out.write(by,2,len);//问题!
else
out.write(by,0,len);}
}
out.close();
in.close();
但是你写的时候确偏移到byte[2],你写出去的是啥???
当循环到了len=40时,你是从byte[2]开始写,那除非你扩容到byte[42],否则很难相信不会越界
关键不是在byte这个缓冲器的大小,而是他这个out.write(,这个参数的问题,);
我把位置移开了,但是文件一样可以运行。
while((len=in.read(by))!=-1){
if(len==17)
out.write(by,2,len);//问题!
else
out.write(by,0,len);}
这个偏移最大可以到23
out.write(by,23,len);
if(len==17)
out.write(by,2,len);//问题!
else
out.write(by,0,len); }
}
首先,当len在1~16的时候,都执行else,所以不会报越界错误、
当读到最后一个字节也就是第17个字节时,就把by[2]~by[18]输出到文件末尾,因为你的by容量是40所以也不会报错
你这里要真正实现缓冲,应该把代码改成:while((len=in.read(by))!=-1){
out.write(by,len-1,1);
}
!____!是从40开始,然后要写到57,在这里的时候,用out.write(by,5,17)写入。
关键就在于
0-23这个位移都可以,而且图片还是可以打开的。他的数据不会出错。通道他在其中写入了00000来代替吗???
而且文件是可以打开的。
Answer:打开是可以,不过可能不能正常显示
public void write(byte[] b, int off,int len)
throws IOException将指定字节数组中从偏移量 off 开始的 len 个字节写入此文件输出流。 参数:
b - 数据。
off - 数据中的起始偏移量。
len - 要写入的字节数