while((len=in.read(buffer))>0)out.write(buffer,0,len)为什么是while而不是if
第一次whlie循环len=1,向out里写入一个数据,第二次while循len=2,向out里覆盖写入两个数据,是这样吗?还是都读完了,再写,如果这样为什么不是If...
第一次whlie循环len=1,向out里写入一个数据,第二次while循len=2,向out里覆盖写入两个数据,是这样吗?还是都读完了,再写,如果这样为什么不是If
展开
2个回答
展开全部
因为io流中到底要读入多少数据事先并不知道,就比如你从一个文档中读内容,内容长短并不确定,while循环就是让不断的向缓存中读,知道读完整个文档为止。如果你用if,在满足条件的情况下,if后边的语句只执行一次,假设此时buffer中只存储了文档中的第一行内容,那你文档中后边的内容都不准备要了吗?所以if不行,因为它后边的语句最多执行一次,不能保证能读完整个文件!
追问
感谢回答!
还有点疑问:每次while循环都执行一次write(buffer,0,len),len是从1一直增加到数据长度N的吗,假设数据长度N,第一次write(buffer,0,1),第二次write(buffer,0,2)....第N次write(buffer,0,N)每次写都会覆盖前一次写过的数据吗?
追答
是这样的,举个例子来说吧。假如你要读取的文件内容如下:
asfdfsda
hghjh
fdf
rewterter
说一下in.read(buffer)的返回值,返回值是你读进缓冲区的字符个数,也就是
如果此时读入的是第一行,那么len就等于8,是第二行那么len就等于5,第三行是3,第四行是9,第五行是结尾那么读入的没有东西,len就是0,此时不满足循环条件,那么跳出循环,读取文件结束。len是多少是看读入buffer了多少个字符,每次都是变化的!而由于每次都是读入多少就写出多少,也就是读入的是什么,写出的就是什么,所以并不会出现你所说的覆盖情况!
展开全部
用while是因为,你一次读取的大小和文件大小不知道谁大,比如一次读1024,而文件大小是小于1024,if就行,正常情况下,都是用while,如果你设定一个缓存区特别大,比如1024*1024 也就是1m,你上传的文件小于1m,一次都到缓存区了,然后缓存区再存到disk里,楼主说txt文件按行读是错的,换行是这个软件给你呈现的,在内存中是\n的ASCII码,还是你按照你设定的缓存区大小加载文件。
比如你定义buffer是1024,那么txt文件就是一次1024字节加载到内存缓存区,
比如你定义buffer是1024,那么txt文件就是一次1024字节加载到内存缓存区,
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询