黑马程序员技术交流社区
标题:
【大神请进!】不胜感激!!缓冲区中关于char被int接收的问题~
[打印本页]
作者:
传奇查
时间:
2015-11-20 02:49
标题:
【大神请进!】不胜感激!!缓冲区中关于char被int接收的问题~
本帖最后由 传奇查 于 2015-11-20 02:56 编辑
请大神赐教!鄙人不胜感激~
~
先贴代码,问题在后面~
package cn.fuxi._06io;
/**
* 练习:
* 自定义一个读取缓冲区类,模拟一个BufferedReader.
* 分析:
* 缓冲区中无非就是封装了一个数组,并对外提供了更多的方法对数组经行访问
* 其实这些方法最终操作的都是数组的角标.
* 缓冲的原理:
* 其实就是从源中获取一批数据到缓冲区中,再从缓冲区中不断的取出一个一个数据.
* 在此次取完后,再从源中继续取一批数据进入缓冲区,当源中的数据被取完时,用-1作为结束标记.
*/
import java.io.*;
class MyBufferedReader{
private Reader r;
//定义一个数组作为缓冲区
private char[] buf = new char[1024];
//定义一个指针用于操作这个数组中的元素,当操作到最后一个元素后,指针应该归零
private int pos = 0;
//定义一个计数器用于记录缓冲区中的数据个数,当该数据减到0;
//就从源中继续获取数据到缓冲区中.
private int count = 0;
MyBufferedReader(Reader r){
this.r = r;
}
//该方法从缓冲区中一次取一个字符
public int myRead() throws IOException{//【<-----大神请看,这里指定的是返回int类型】
//从源中获取一批数据到缓冲区中,需要先做判断,只有计数器为0时,才需要
//从源中获取数据.
if(count == 0){
count = r.read(buf);
//每次获取数据到缓冲区后,角标归零
pos = 0;
}
if(count<0)
return -1;
char ch = buf[pos];
pos++;
count--;
return ch; //【<------我的问题在这里!!】方法声明中指定返回的是int类型,为什么这里可以返回char类型?不报错,并且运行正常,是因为抛了IO异常吗?
}
public String myReadLine() throws IOException{
StringBuilder sb = new StringBuilder();
int ch = 0;
while((ch=myRead())!=-1){
if(ch=='\r')
continue;
if(ch=='\n')
return sb.toString();
//从缓冲区读取到的字符,存储到缓冲行的缓冲区中
sb.append((char)ch);
}
if(sb.length()!=0){
return sb.toString();
}
return null;
}
public void myClose() throws IOException{
r.close();
}
}
public class _13BufferTest {
public static void main(String[] args) throws IOException {
FileReader fr = new FileReader("IoDemo.txt");
MyBufferedReader mbr = new MyBufferedReader(fr);
String line = null;
while((line=mbr.myReadLine())!=null){
System.out.println(line);
}
mbr.myClose();
}
}
复制代码
请看代码中的myRead()方法,方法声明中指定返回的是int类型,为什么这里可以返回char类型?不报错,并且运行正常,是因为抛了IO异常吗?
在下百思不得其解!还请赐教!鄙人不胜感激!
~~恭喜发财~
作者:
传奇查
时间:
2015-11-20 11:40
坐等大神~鲜花奉上~
作者:
耀阳圣尊
时间:
2015-11-20 15:21
因为在字符流的读取中,字符无法判断结束为(字符的取值范围是0-65535)。所以需要提升类型
作者:
传奇查
时间:
2015-11-20 19:23
耀阳圣尊 发表于 2015-11-20 15:21
因为在字符流的读取中,字符无法判断结束为(字符的取值范围是0-65535)。所以需要提升类型 ...
大神提醒我了!仔细看了API文档!豁然开朗~因为API确实是这么定义的!谢谢大神!
public int read()
throws IOException读取单个字符。在字符可用、发生 I/O 错误或者已到达流的末尾前,此方法一直阻塞。
用于支持高效的单字符输入的子类应重写此方法。
返回:
作为整数读取的字符,
范围在 0 到 65535 之间 (0x00-0xffff),如果已到达流的末尾,则返回 -1 .
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2