请教java字节输入流的问题

2025-04-06 16:07:28
推荐回答(2个)
回答1:

下面那位兄台,文件超过了1024,是不会自动扩展的。
buf就像一个水桶,文件相当于一个水缸,现在你定义了一个大小为 1024 的水桶,
while((len=fis.read(buf))!=-1)
这句话就相当于 fis去读 文件,一次读取的最大值是1024,即你拿个大小为1024的水桶去水缸里装水,如果能打满就打满,并把打了多少水告诉 len (如果装满了,返回值是1024) ,如果打了半桶,就返回半桶的量,如果文件结束了,就返回 -1 。打了水之后,就去执行{}里面的内容,执行完后,又去打水,如此反复,直到打完水缸里的水。

回答2:

首先解释你不明白为什么要在循环中的问题. 因为, len和ch都是在while函数中赋的值.每循环一次, 其值都会在变化.如果你定义到外面. 那么,最后输出的就是最后一次循环后的值,
第二个问题,你说byte数组的问题,定义1024相当于,缓存. 每循环一次,读取1024个字节到内存.之所以用1024.是因为,电脑是2进制的,每一级单位进位的时候 其倍数都是1024倍,也就是2的10次方.1kb=1024byte.1mb=1024kb,1gb=1024mb. 如果你定一个其它大小的数组,就有可能存在读取混乱.或读不到的情况.
比如一个汉字,是2个字节.你如果字的数组大小成了单数,电脑不可能给你显个半边字啊.然后你用的int或char来接收的,那它又会对这个读取的字节进行一下处理,自动取整,那就完全不是本来应该读取的东西了,变成了,它给你配成的东西.
你还问,可不可以定义成别的大小, 这是可以的, 只要是1024的倍数或整除数就行.你可以写成,1024*1000*2 这样每一次读取的就是2M的数据,只要你的CPU和内存取够强大.你想读多少都没问题.
第一种写法是可以提高效率, 就像我说的, 可以改,你想读多少就读多少.而且可以通过这个缓存机制来保护内存.安全性要高些.