黑马程序员技术交流社区

标题: 关于InputStream中read方法的一点疑问 [打印本页]

作者: 李贺晓    时间: 2012-12-8 15:52
标题: 关于InputStream中read方法的一点疑问
import java.io.*;
public class TestSplit {
/**
  * @param args
  */
public static void main(String[] args)throws IOException {
  // TODO Auto-generated method stub
  FileInputStream fis=new FileInputStream("f:\\mp3\\火力全开.mp3");
  FileOutputStream fiw=null;
  byte[] b=new byte[1024*1024];//定义一个1M的数组
  int len=0;
  int count=0;
  while((len=fis.read(b))!=-1)//这里有一个疑问,当len不等于-1的时候,这个时候的判断不是对fis这个文件的判断是否已经读完,这里为什么会自动进行分割呢
                                          //当这个数组装满的时候,不是自动又把读到的字节替换前面的字节吗?
  {
   fiw=new FileOutputStream("f:\\"+(count++)+".part");
   fiw.write(b, 0, len);
   fiw.close();
  }
  fis.close();
   
}
}
在这里一下迷糊了,不知道这是如何自动创建多个文件的(在我的理解中,不是只会创建一个文件的吗?因为只要不把fis这个文件读完,是一直在循环体中运行啊)

作者: xjandrew    时间: 2012-12-8 16:59
当len不等于-1的时候,fis.read(b)是在持续读取下一个数据字节,如果读取已到达文件末尾,则返回 -1。
当fis.read(b)读完数组数据后,才会将数据赋给输出流,输出流fiw.close()后,输出给文件的只有一部分数据,所以才会生成原文件切割后的碎片.part。
第一部分.part输出完后,开始第二部分.part的读写。
你在while中加条打印输出语句试试
  1. while((len=fis.read(b))!=-1)//这里有一个疑问,当len不等于-1的时候,这个时候的判断不是对fis这个文件的判断是否已经读完,这里为什么会自动进行分割呢
  2.                                           //当这个数组装满的时候,不是自动又把读到的字节替换前面的字节吗?
  3.   {
  4.    [color=Red]System.out.println(b);[/color]   
  5.    fiw=new FileOutputStream("f:\\"+(count++)+".part");
  6.    fiw.write(b, 0, len);
  7.    fiw.close();
  8.   }
复制代码

作者: qiucheng1990    时间: 2012-12-9 08:29
我在学视频的时候也感觉这个read方法很有意思,它比较绕弯子。在FileInputStream中int read(byte[] b)
         是表示, 从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中。 如果看懂了这句话,用起来就不难理解
while((len=fis.read(b))!=-1)这段代码了
输入流把1m的数据存入到了b中。len只是用来判断是否还有数据。存入和判断两件事和为了这一句代码。这就是自动分割。
当while第二次循环的时候再次调用read方法,再次把b填满,这个时候应该会冲刷掉b以前寸的数据。




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