请教java字节输入流的问题 10
publicstaticvoidreadFile_2()throwsIOException{FileInputStreamfis=newFileInputStream("...
public static void readFile_2()throws IOException
{
FileInputStream fis = new FileInputStream("fos.txt");
byte[] buf = new byte[1024];
int len = 0;
while((len=fis.read(buf))!=-1)
{
System.out.println(new String(buf,0,len));
}
fis.close();
}
这个代码,其中不明白为什么System.out.println(new String(buf,0,len));写在了循环里面,而不是外面。这样究竟是读一个字节就打印一个,还是全部将文件中的数据读完后,再打印。
另外还有问题,就是这个byte[]数组设置为1024大小,那么如果文件中的大小超过了1024字节,这种写法似乎仍然能读,为什么呢?
public static void readFile_1()throws IOException
{
FileInputStream fis = new FileInputStream("fos.txt");
int ch = 0;
while((ch=fis.read())!=-1)
{
System.out.println((char)ch);
}
fis.close();
}
还想请问,原程序的循环中,是读入一个字节就输出,还是将数组读满了后一次性输出,不明白为什么System.out.println(new String(buf,0,len));在循环中,这样还是认为是应该读一个字节就输出一次,并不是把数组读满了或者读到-1了再批量输出。和我上面给出的程序有区别吗?说第一种写法能提高效率,是批量输出,不理解,觉得如果输出语句写在循环中的话,两种写法没有区别。 展开
{
FileInputStream fis = new FileInputStream("fos.txt");
byte[] buf = new byte[1024];
int len = 0;
while((len=fis.read(buf))!=-1)
{
System.out.println(new String(buf,0,len));
}
fis.close();
}
这个代码,其中不明白为什么System.out.println(new String(buf,0,len));写在了循环里面,而不是外面。这样究竟是读一个字节就打印一个,还是全部将文件中的数据读完后,再打印。
另外还有问题,就是这个byte[]数组设置为1024大小,那么如果文件中的大小超过了1024字节,这种写法似乎仍然能读,为什么呢?
public static void readFile_1()throws IOException
{
FileInputStream fis = new FileInputStream("fos.txt");
int ch = 0;
while((ch=fis.read())!=-1)
{
System.out.println((char)ch);
}
fis.close();
}
还想请问,原程序的循环中,是读入一个字节就输出,还是将数组读满了后一次性输出,不明白为什么System.out.println(new String(buf,0,len));在循环中,这样还是认为是应该读一个字节就输出一次,并不是把数组读满了或者读到-1了再批量输出。和我上面给出的程序有区别吗?说第一种写法能提高效率,是批量输出,不理解,觉得如果输出语句写在循环中的话,两种写法没有区别。 展开
展开全部
下面那位兄台,文件超过了1024,是不会自动扩展的。
buf就像一个水桶,文件相当于一个水缸,现在你定义了一个大小为 1024 的水桶,
while((len=fis.read(buf))!=-1)
这句话就相当于 fis去读 文件,一次读取的最大值是1024,即你拿个大小为1024的水桶去水缸里装水,如果能打满就打满,并把打了多少水告诉 len (如果装满了,返回值是1024) ,如果打了半桶,就返回半桶的量,如果文件结束了,就返回 -1 。打了水之后,就去执行{}里面的内容,执行完后,又去打水,如此反复,直到打完水缸里的水。
buf就像一个水桶,文件相当于一个水缸,现在你定义了一个大小为 1024 的水桶,
while((len=fis.read(buf))!=-1)
这句话就相当于 fis去读 文件,一次读取的最大值是1024,即你拿个大小为1024的水桶去水缸里装水,如果能打满就打满,并把打了多少水告诉 len (如果装满了,返回值是1024) ,如果打了半桶,就返回半桶的量,如果文件结束了,就返回 -1 。打了水之后,就去执行{}里面的内容,执行完后,又去打水,如此反复,直到打完水缸里的水。
追问
不好意思,还是有些问题,发到你百度私信里了,麻烦看下能否解答下,追问写不下了,谢谢你。
展开全部
首先解释你不明白为什么要在循环中的问题. 因为, 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和内存取够强大.你想读多少都没问题.
第一种写法是可以提高效率, 就像我说的, 可以改,你想读多少就读多少.而且可以通过这个缓存机制来保护内存.安全性要高些.
第二个问题,你说byte数组的问题,定义1024相当于,缓存. 每循环一次,读取1024个字节到内存.之所以用1024.是因为,电脑是2进制的,每一级单位进位的时候 其倍数都是1024倍,也就是2的10次方.1kb=1024byte.1mb=1024kb,1gb=1024mb. 如果你定一个其它大小的数组,就有可能存在读取混乱.或读不到的情况.
比如一个汉字,是2个字节.你如果字的数组大小成了单数,电脑不可能给你显个半边字啊.然后你用的int或char来接收的,那它又会对这个读取的字节进行一下处理,自动取整,那就完全不是本来应该读取的东西了,变成了,它给你配成的东西.
你还问,可不可以定义成别的大小, 这是可以的, 只要是1024的倍数或整除数就行.你可以写成,1024*1000*2 这样每一次读取的就是2M的数据,只要你的CPU和内存取够强大.你想读多少都没问题.
第一种写法是可以提高效率, 就像我说的, 可以改,你想读多少就读多少.而且可以通过这个缓存机制来保护内存.安全性要高些.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
byte[]数组设置为1024只是说明初始长度为1024,如果超过之后会自动扩展, 在循环里是一个一个打印的
追问
数组大小不是已经定死了吗,为什么还能扩展呢?
还有如果这样循环里是一个一个打印的话,那没有必要设置字节数组了,并不是先都读入数组,再一次性写出啊,完全不能提高效率啊?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询