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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

这是毕老师的视频的截图。讲的是用字节流进行图片的复制。部分代码为: frs = new FileInputStream("c:\\1.bmp");fos = new FileOutputStream("c:\\2.bmp");
byte[] buf = new byte[1024];
int len = 0;
while((len=frs.read(buf))!=-1){
fos.write(buf,0,len);


}
但是图片的大小为2.92mb,3072054字节,1024大小的字节数组怎么可能装的下?求大神指点。

捕获.PNG (138.65 KB, 下载次数: 220)

捕获.PNG

17 个回复

倒序浏览
这个是分开读取的,每次读取1024个字节,这样快速度快点,如果是1个字节就会慢很多,这个1024只是读取空间的大小
回复 使用道具 举报
这个是循环调用的,每次读取1kb
回复 使用道具 举报
读和写都是放在while循环中的,每次读取1024个字节,也就是1kb,如果最后一次读取和写入可能不够1024个字节,所以写入的时候加了fos.write(buf,0,len);意思是还剩多少就写多少。
回复 使用道具 举报
549208564 发表于 2016-1-6 21:08
这个是分开读取的,每次读取1024个字节,这样快速度快点,如果是1个字节就会慢很多,这个1024只是读取空间 ...

我想知道这几句代码的具体操作步骤是什么?len=frs.read(buf))!=-1是往缓冲区数组中读入是吧,但是因为图片数据大,图片数据没读完,数组已经满了。这时候会再怎么操作,因为len=frs.read(buf))!=-1这句话还在为true,难道还在往数组存吗,但是数组已经满了?是不是当数组存满后就开始读fos.write(buf,0,len);这句话了?求详细解答。谢谢。
回复 使用道具 举报
风浪中 发表于 2016-1-6 21:57
这个是循环调用的,每次读取1kb

怎么个循环调用步骤,还是不太懂,能否详细解答。谢谢
回复 使用道具 举报
teng13114 发表于 2016-1-6 22:30
我想知道这几句代码的具体操作步骤是什么?len=frs.read(buf))!=-1是往缓冲区数组中读入是吧,但是因为图 ...

当读到len=frs.read(buf)!=-1,条件达成,执行fos.write(buf,0,len)将数据写入文件,在去判断,frs.read(buf)这句就是将读取到的数据存入buf中,如果没有就会返回一个-1,len接收,每次读取的都是buf的大小,不会多也不会少,当循环第二次时会将buf中的数据覆盖,如果是frs.writer(buf),没有长度,你就会发现,最后的数据并没覆盖完
回复 使用道具 举报
黑色皮肤的马 发表于 2016-1-6 22:07
读和写都是放在while循环中的,每次读取1024个字节,也就是1kb,如果最后一次读取和写入可能不够1024个字节 ...

len=frs.read(buf))!=-1为truefos.write(buf,0,len)才执行,len=frs.read(buf))!=-1为true意味着,数据输入流数据读完了,但是数组只存储了1024呀,怎么可能会循环多次?不就是循环一次吗
回复 使用道具 举报
549208564 发表于 2016-1-6 22:47
当读到len=frs.read(buf)!=-1,条件达成,执行fos.write(buf,0,len)将数据写入文件,在去判断,frs.read(b ...

len=frs.read(buf)!=-1,如果条件达成的话,就去读fos.write(buf,0,len)这句话了。为什么还会循环回去判断len=frs.read(buf)!=-1?
回复 使用道具 举报
teng13114 发表于 2016-1-6 22:53
len=frs.read(buf)!=-1,如果条件达成的话,就去读fos.write(buf,0,len)这句话了。为什么还会循环回去判断 ...

可能是我说的话让你误解了,这里不是一个循环语句吗,当执行fos.writer(buf,0,len)之后,选运行frs.read(buf)在赋值给len,在去判断是不是等于-1,如果不是-1就执行,是-1就不执行
读取是read(),writer()是写入
回复 使用道具 举报
观摩一下。。。还没学到。。。。。
回复 使用道具 举报
teng13114 发表于 2016-1-6 22:50
len=frs.read(buf))!=-1为truefos.write(buf,0,len)才执行,len=frs.read(buf))!=-1为true意味着,数据输 ...

这个是while循环,只要条件满足就一直循环。比如,假如照片是1026k,那么读取的时候虽然一下读取1024个字节,其实还是一个一个字节读取的。如果读到末尾了会返回-1,说明已经读完了。当第一次读玩1024个字节后,由于还有数据,返回值不是-1,那么while循环就满足条件了,还会继续循环,再把剩下的读取。但是只剩2个字节了,所以读了2个后返回-1,就不循环了。接着fos.write(buf,0,len);把剩余的2个字节写下来。(希望我没说错)
回复 使用道具 举报
549208564 发表于 2016-1-6 22:58
可能是我说的话让你误解了,这里不是一个循环语句吗,当执行fos.writer(buf,0,len)之后,选运行frs.read( ...

有点懂了。但是又产生了一个新的疑问?如果一共有1026字节的文件,第一次循环读取了1024的大小的数组,此时len=frs.read(buf))!=-1为true,运行fos.write(buf,0,len);1024字节便从输出流写了出来。再接着第二次循环,此时读到2个字节后,数据没有了,岂不是len=frs.read(buf))!=-1为false了,那么fos.write(buf,0,2)这句话不就是读不到了?
回复 使用道具 举报
我觉得它读完1024之后,读剩余的2个的时候数组的长度len已经变成len=2,所以第二次读的时候读到2就不往下读了,所以不可能返回-1的,所以就能进入到循环体内,自己是这样体会的,不知道对不对。
回复 使用道具 举报
542826323 发表于 2016-1-7 09:52
我觉得它读完1024之后,读剩余的2个的时候数组的长度len已经变成len=2,所以第二次读的时候读到2就不往下读 ...

恩恩。len=frs.read(buf)这句话还是不太懂。
回复 使用道具 举报
teng13114 发表于 2016-1-7 09:36
有点懂了。但是又产生了一个新的疑问?如果一共有1026字节的文件,第一次循环读取了1024的大小的数组,此 ...

呃。。。这个问题问的好,不过我也记不住了,len接收的是长度,当没有的时候数据时read()会返回-1,就是还有内容就不会返回-1,当读到最后时返回读到的数据长度,所以读到2个节后就不读了,然后写入数据,长度是0~len,在返回读取时,没有数据,返回-1,不在执行fos.write(buf,0,len)
   更正以下之前的,这个是字节流,每次都是读取一个字节,只是每次是存入到一个缓存数组中,在从缓存数组中读取,就不用读一个写一个,提高了效率
   
回复 使用道具 举报
不是在循环体里面吗,没有读到末尾也就是-1的时候就会一直读的
回复 使用道具 举报
我只能说为楼主感到悲哀,这么多人没一个能理解楼主的意思!楼主的问题清晰明了:frs.read(buf))!   buf为一个1024字节的数组,这句意思是从输入六中读入数据,保存在buf中
最多为1024. 如果一个数据 为1030超过了1024,buf被填满。为什么还能执行第二次循环!
问题来了,1.难道每次读写完都会清空buf。2.就算清空了buf第二次读取的初始位置是怎么确定的?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马