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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘士林 中级黑马   /  2012-10-29 23:08  /  1528 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

看毕老师的视频IO流部分,字符读取流的read()方法,让我搞不明白,如下:

FileReader fr = new FileReader("abcd.txt");
int ch = 0;//此处定义int接收,因为read()方法的返回值是int型,读取的是字符,为什么是int呢?
while((ch=fr.read())!=-1)
{
  System.out.println((char)ch);
}
fr.close();

FileReader fr = new FileReader("ab.txt");
char[] arr = new  char[1024];//定义数组接收读取到的字符,为什么定义成char类型的数组呢,不是返回int型吗?
int num = 0;
while((num=fr.read(arr))!=-1)
{
  System.out.println(new String(arr,0,num));
}
fr.close();
对字符流不是很理解,说是基于字节流,读取的是字节,只是缓冲了一下,然后去查编码表,既然查表了返回的应该就是字符了,为什么还是int型呢?
如果返回的是int型,那么就应该定义int数组接收,为什么定义char数组呢,矛盾啊!

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

2 个回复

正序浏览
看毕老师的视频IO流部分,字符读取流的read()方法,让我搞不明白,如下:

FileReader fr = new FileReader("abcd.txt");
int ch = 0;//此处定义int接收,因为read()方法的返回值是int型,读取的是字符,为什么是int呢?
// read()方法读取的是字符,读取了多少个字符,所以返回的是字符的个数,个数是int类型的,读取了多少个字符
while((ch=fr.read())!=-1)
{
System.out.println((char)ch);
}
fr.close();

FileReader fr = new FileReader("ab.txt");
char[] arr = new char[1024];//定义数组接收读取到的字符,为什么定义成char类型的数组呢,不是返回int型吗?
//把读取到的字符存起来,存的是字符,定义数组类型当然是char类型。
int num = 0;
while((num=fr.read(arr))!=-1)
{
System.out.println(new String(arr,0,num));
}
fr.close();
对字符流不是很理解,说是基于字节流,读取的是字节,只是缓冲了一下,然后去查编码表,既然查表了返回的应该就是字符了,为什么还是int型呢?
返回的是字符的个数(读取了多少个字符),存的是字符类型
如果返回的是int型,那么就应该定义int数组接收,为什么定义char数组呢,矛盾啊!
读取了一堆数据 ,这些数据有多少个?所以返回的是int 类型。
然后他们存放在数组里,数组类型为char类型。

字节流先出现的,读一个存一个。
数据多了以后,一个一个存读,一个一个的存,有点麻烦,所以就出现了字符流,先读一部分(例如读一行数据),然后在存
加入缓冲区可以提高效率。





评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

回复 使用道具 举报
int ch = 0;//此处定义int接收,因为read()方法的返回值是int型,读取的是字符,为什么是int呢?
因为这个是返回接受了多少个字节,如果接受失败了,或者结束了,就返回-1了
char[] arr = new  char[1024];//定义数组接收读取到的字符,为什么定义成char类型的数组呢,不是返回int型吗?
这个里面放读取到的字符,相当于一个缓冲区

你看程序里:while((ch=fr.read())!=-1)和while((num=fr.read(arr))!=-1)两个while循环,你就没点想法吗??
第一个的ch就相当于第二个的num 不是吗?只不过第一个的read函数里面没有放参数,第二个里面放了个arr数组去接受,自己再看看jdk文档吧

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马