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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李贺晓 中级黑马   /  2012-12-8 15:52  /  1576 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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这个文件读完,是一直在循环体中运行啊)

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

2 个回复

倒序浏览
当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.   }
复制代码

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

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

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马