黑马程序员技术交流社区

标题: 关于read方法获取硬盘上的文件的字符的问题 [打印本页]

作者: 胡雷    时间: 2011-8-30 01:15
标题: 关于read方法获取硬盘上的文件的字符的问题
FileReader fr = new FileReader("1.txt");
char[] ch = new char[6];
int num = fr.read(ch);
System.out.println("num="+num+"..."+String.valueOf(ch));
1.txt里面有10个字符
我想问的是fr.read方法获取字符并存入ch中,是一次性获取6个字符存到ch中,还是每次获取一个字符存到ch中,直到chd存满为止?

谢谢!
作者: 匿名    时间: 2011-8-30 09:16
从javaAPI文档中可以查到, fr.read()方法每次读取单字符,并将其存入到你所定义的数组中,当数组存满后即输入一次,然后再把读取的字符存入到数组的第一个位置,依次类推。
作者: 匿名    时间: 2011-8-30 09:39
public int read(char[] cbuf)
         throws IOException将字符读入数组。在某个输入可用、发生 I/O 错误或者已到达流的末尾前,此方法一直阻塞。

参数:
cbuf - 目标缓冲区
返回:
读取的字符数,如果已到达流的末尾,则返回 -1
抛出:
IOException - 如果发生 I/O 错误


API中没有你说的这样描述啊?
作者: 李叶    时间: 2011-8-30 11:12
其实这个问题,主要就是个流的概念的问题
流就是一种数据在传输时的形态,简单理解的话,你可以把流想象成一串有序的010010101010之类的序列
所以,不管你调用什么方法去读取数据,数据永远是以这样一串有序的数字的形态依次读取进来的
其实,所有各种各样的读取方法之间的区别,只是每次读取数据时所使用的单位不同而已,本质上都是一样的
所以,当你调用fr.read()方法读取数据的时候,数据也是通过这样一个序列依次地读取进来的
用你的话说,应该就是“每次获取一个字符存到ch中,直到chd存满为止”了

其实更确切的说,应该是下面这种说法:
将字符按顺序依次地读到ch中,直到chd存满、或者文件中没有可读的字符,或者读取的过程中出现异常为止

所以,缓冲区的作用是:
fr只管一门心思从文件中往缓冲区里读数据,只要缓冲区读满了,就返回一次
而不是,fr根据缓冲区的大小,去读取文件中相应长度的数据并返回
这样解释的话,应该就更明白些了吧~
[ 本帖最后由 李叶 于 2011-08-30  11:25 编辑 ]
作者: 匿名    时间: 2011-8-30 12:29
其实可以这样理解,FileReader是操作字符流而不是“字符串流”,因此每次read()每次只能读取一个字符,处理一个字符,字符数组只是提供了一个容器的作用,来装每一次read读取的字符,就像每次只流出一滴水,要喝的痛快,就装满才喝,如果你一次就可以处理那么多字符,那么就不是定义字符数组来装,而是定义字符串数组来装,那不是更给力。
作者: 匿名    时间: 2011-8-30 13:32
标题: 回复 板凳 的帖子
谢谢  我差不多明白了。
作者: 匿名    时间: 2011-8-30 13:33
标题: 回复 报纸 的帖子
谢谢。。。。。。
作者: 匿名    时间: 2011-8-30 13:35
:lol 。。。。。。。。。。。。。。。。。。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2