A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 何旭栋 中级黑马   /  2012-6-12 18:15  /  1860 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 何旭栋 于 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?

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 byte[]数组是缓冲区,不是容器~~.

查看全部评分

4 个回复

倒序浏览
本帖最后由 杨天皓 于 2012-6-12 18:35 编辑

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

这个方法说的很明白了,你定义的byte数组的长度是1024,那你循环去读,一个字节的一个字节的往数组里面存。存满1024个字节了,就把这个数组传递出去。如果当读到最后一个字节的下一个,没有了数据了,那read就会返回-1,这个时候byte数组里面有多少个字节就往外传多少

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
所以byte数组的长度定义成多少这个是因人而定,也因文件而定。你可以定义大一点,也可以小一点。只是通常我们定义的就是1024的整数倍
回复 使用道具 举报
杨天皓 发表于 2012-6-12 18:21
read(byte[] b) 从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中。
返回:读入缓冲区的字节 ...

也就是buf读1024字节返回一次,fos.write写一次数据,接着继续循环,直到读到文件末尾?
那明白了,谢谢
回复 使用道具 举报
当数组装满了之后,不是继续往数组后面添加数据,它指向数组脚标的指针会自动回到数组最开始的位置,重新从数组的0脚标开始再往数组里面添加数据,覆盖数组原来的数据。这个时候你就要注意,有可能最后一次往数组里面写入数据的时候并没有刚好覆盖整个数组,就需要设置读取数组的长度,这个长度就是每次重新往数组里面写入的字节个数。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马