黑马程序员技术交流社区

标题: 关于字节流拷贝疑问 [打印本页]

作者: 何旭栋    时间: 2012-6-12 18:15
标题: 关于字节流拷贝疑问
本帖最后由 何旭栋 于 2012-6-12 18:16 编辑
  1. import java.io.*;
  2. class CopyPic
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 FileOutputStream fos = null;
  7.                 FileInputStream  fis = null;
  8.                 try
  9.                 {
  10.                         fos = new FileOutputStream("2.bmp");
  11.                         //看毕老师视频里原图像文件有3m
  12.                         fis = new FileInputStream("1.bmp");  
  13.                         //这里才定义1kb,没有用fis.available()定义长度
  14.                         byte[] buf = new byte[1024];
  15.                         int len = 0;
  16.                         //这里buf为什么没有发生角标越界??
  17.                         while ((len=fis.read(buf)) != -1)
  18.                         {
  19.                                 fos.write(buf,0,len);
  20.                         }
  21.                 }
  22.                 catch (IOException e)
  23.                 {
  24.                         ......
  25.                 }
  26.                 finally
  27.                 {
  28.                         ......
  29.                 }
  30.         }
  31. }
复制代码
看毕老师视频里面的拷贝图片例子有点疑问,为什么数组buf没有发生角标越界,图片的字节明显大于1024?

作者: 杨天皓    时间: 2012-6-12 18:21
本帖最后由 杨天皓 于 2012-6-12 18:35 编辑

read(byte[] b) 从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中。
返回:读入缓冲区的字节总数,如果因为已经到达文件末尾而没有更多的数据,则返回 -1。

这个方法说的很明白了,你定义的byte数组的长度是1024,那你循环去读,一个字节的一个字节的往数组里面存。存满1024个字节了,就把这个数组传递出去。如果当读到最后一个字节的下一个,没有了数据了,那read就会返回-1,这个时候byte数组里面有多少个字节就往外传多少
作者: 杨天皓    时间: 2012-6-12 18:23
所以byte数组的长度定义成多少这个是因人而定,也因文件而定。你可以定义大一点,也可以小一点。只是通常我们定义的就是1024的整数倍
作者: 何旭栋    时间: 2012-6-12 18:30
杨天皓 发表于 2012-6-12 18:21
read(byte[] b) 从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中。
返回:读入缓冲区的字节 ...

也就是buf读1024字节返回一次,fos.write写一次数据,接着继续循环,直到读到文件末尾?
那明白了,谢谢
作者: 黄克帅    时间: 2012-6-12 18:47
当数组装满了之后,不是继续往数组后面添加数据,它指向数组脚标的指针会自动回到数组最开始的位置,重新从数组的0脚标开始再往数组里面添加数据,覆盖数组原来的数据。这个时候你就要注意,有可能最后一次往数组里面写入数据的时候并没有刚好覆盖整个数组,就需要设置读取数组的长度,这个长度就是每次重新往数组里面写入的字节个数。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2