黑马程序员技术交流社区
标题:
关于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中加条打印输出语句试试
while((len=fis.read(b))!=-1)//这里有一个疑问,当len不等于-1的时候,这个时候的判断不是对fis这个文件的判断是否已经读完,这里为什么会自动进行分割呢
//当这个数组装满的时候,不是自动又把读到的字节替换前面的字节吗?
{
[color=Red]System.out.println(b);[/color]
fiw=new FileOutputStream("f:\\"+(count++)+".part");
fiw.write(b, 0, len);
fiw.close();
}
复制代码
作者:
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