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:为什么不会出错)

解决方案 »

  1.   

     进入循环:
    第一次写:by这个缓冲器返回长度40,然后out.write(by,0,40);
    第二次写:by这个缓冲器返回长度17,然后out.write(by,0,17);上面是17,写错了
      

  2.   

    1:
    第二次缓冲的话,应该是从41开始,一直写到57,共17个字节2:
    我测试的问题2是报错的,java.lang.IndexOutOfBoundsException,明显越界了,
    偏移为2 len仍然为40,当然不对
      

  3.   

    说实在的,不太明白你的意思
    我知道的是这个out对象没被关闭,那么它对外写文件就不会自动覆盖前面写出去的内容,而是跟在后面继续写
      

  4.   


    可能是写代码不一样。我写给你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(); 
      

  5.   

    还有我不明白的是你那个byte在第一次循环的时候只有byte[0]获得了值
    但是你写的时候确偏移到byte[2],你写出去的是啥???
    当循环到了len=40时,你是从byte[2]开始写,那除非你扩容到byte[42],否则很难相信不会越界
      

  6.   

    不好意思,把大家搞得晕头转向了。
    关键不是在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);
      

  7.   

    while((len=in.read(by))!=-1){ 
    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);
      

  8.   

    为了更好大家理解,我写个图。!_____________!____!上面代表这个byte数据第一次!_____________!40长度,用out.write(by,0,40)写入第二次
    !____!是从40开始,然后要写到57,在这里的时候,用out.write(by,5,17)写入。
    关键就在于
    0-23这个位移都可以,而且图片还是可以打开的。他的数据不会出错。通道他在其中写入了00000来代替吗???
      

  9.   

    我越说越离谱了其实就是一个byte数据,我写两次!!!第一次,我写40,第二次,我要写17,可是(我在中间给他加上了位移,意思就是让他给我移开几位再写);
    而且文件是可以打开的。
      

  10.   

    其实楼主就是想问,把一个图片里的数据Change一下为什么还能打开?
    Answer:打开是可以,不过可能不能正常显示
      

  11.   

    java.io.FileOutputStream
    public void write(byte[] b, int off,int len)
               throws IOException将指定字节数组中从偏移量 off 开始的 len 个字节写入此文件输出流。 参数:
    b - 数据。
    off - 数据中的起始偏移量。
    len - 要写入的字节数