黑马程序员技术交流社区

标题: 【大神请进!】不胜感激!!缓冲区中关于char被int接收的问题~ [打印本页]

作者: 传奇查    时间: 2015-11-20 02:49
标题: 【大神请进!】不胜感激!!缓冲区中关于char被int接收的问题~
本帖最后由 传奇查 于 2015-11-20 02:56 编辑

请大神赐教!鄙人不胜感激~~

先贴代码,问题在后面~
  1. package cn.fuxi._06io;
  2. /**
  3. * 练习:
  4. *                 自定义一个读取缓冲区类,模拟一个BufferedReader.
  5. * 分析:
  6. *                 缓冲区中无非就是封装了一个数组,并对外提供了更多的方法对数组经行访问
  7. *                 其实这些方法最终操作的都是数组的角标.
  8. * 缓冲的原理:
  9. *                 其实就是从源中获取一批数据到缓冲区中,再从缓冲区中不断的取出一个一个数据.
  10. *                 在此次取完后,再从源中继续取一批数据进入缓冲区,当源中的数据被取完时,用-1作为结束标记.
  11. */
  12. import java.io.*;

  13. class MyBufferedReader{
  14.         private Reader r;
  15.         //定义一个数组作为缓冲区
  16.         private char[] buf = new char[1024];
  17.         //定义一个指针用于操作这个数组中的元素,当操作到最后一个元素后,指针应该归零
  18.         private int pos = 0;
  19.         //定义一个计数器用于记录缓冲区中的数据个数,当该数据减到0;
  20.         //就从源中继续获取数据到缓冲区中.
  21.         private int count = 0;
  22.         MyBufferedReader(Reader r){
  23.                 this.r = r;
  24.         }
  25.         //该方法从缓冲区中一次取一个字符
  26.         public int myRead() throws IOException{//【<-----大神请看,这里指定的是返回int类型】
  27.                 //从源中获取一批数据到缓冲区中,需要先做判断,只有计数器为0时,才需要
  28.                 //从源中获取数据.
  29.                 if(count == 0){
  30.                         count = r.read(buf);
  31.                         //每次获取数据到缓冲区后,角标归零
  32.                         pos = 0;
  33.                 }
  34.                 if(count<0)
  35.                         return -1;
  36.                
  37.                 char ch = buf[pos];
  38.                 pos++;
  39.                 count--;
  40.                 return ch; //【<------我的问题在这里!!】方法声明中指定返回的是int类型,为什么这里可以返回char类型?不报错,并且运行正常,是因为抛了IO异常吗?
  41.         }
  42.         public String myReadLine() throws IOException{
  43.                 StringBuilder sb = new StringBuilder();
  44.                 int ch = 0;
  45.                 while((ch=myRead())!=-1){
  46.                         if(ch=='\r')
  47.                                 continue;
  48.                         if(ch=='\n')
  49.                                 return sb.toString();
  50.                         //从缓冲区读取到的字符,存储到缓冲行的缓冲区中
  51.                         sb.append((char)ch);
  52.                 }
  53.                 if(sb.length()!=0){
  54.                         return sb.toString();
  55.                 }
  56.                 return null;
  57.         }
  58.         public void myClose() throws IOException{
  59.                 r.close();
  60.         }

  61. }

  62. public class _13BufferTest {
  63.         public static void main(String[] args) throws IOException {
  64.                 FileReader fr = new FileReader("IoDemo.txt");
  65.                 MyBufferedReader mbr = new MyBufferedReader(fr);
  66.                 String line = null;
  67.                 while((line=mbr.myReadLine())!=null){
  68.                         System.out.println(line);
  69.                 }
  70.                 mbr.myClose();
  71.         }
  72. }
复制代码

请看代码中的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