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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© @白纸嘿字@ 中级黑马   /  2015-10-12 01:51  /  3374 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

2黑马币
本帖最后由 @白纸嘿字@ 于 2015-10-12 01:53 编辑

这是毕向东模拟BufferedReader写的,看后有一个问题想问一问,就是25行的“int”,能不能改成char?
  1. package com.itheima.io.buffer;

  2. import java.io.IOException;
  3. import java.io.Reader;

  4. public class MyBufferedReader {
  5.         //持有一个流对象
  6.         private Reader r;
  7.         //因为是缓冲区对象,所以内部必须维护了一个数组
  8.         private char[] buffer=new char[1024];
  9.         //定义角标
  10.         private int index=0;
  11.         //定义变量,记录住数组中元素的个数
  12.         private int count=0;
  13.         //一初始化就必须明确被缓冲的流对象
  14.         public MyBufferedReader(Reader r) {
  15.                 super();
  16.                 this.r = r;
  17.         }
  18.        
  19.         /**
  20.          * 读取一个字符的方法,而且是高效的
  21.          * @throws IOException
  22.          */
  23.         public int myRead() throws IOException{
  24.                 if(count==0){
  25.                 //通过被缓冲的流对象的read方法,就可以将设备上的数据存储到数组中
  26.                 count=r.read(buffer);
  27.                 index=0;//执行这个操作,是不是因为index自增到最后一个了,所以这个就要把index归零
  28.                 }
  29.                 if(count<0)
  30.                         return -1;
  31.                 char ch=buffer[index];
  32.                 index++;//每取一次都要自增
  33.                 count--;//取出一个,数组的数量就要减少。一旦减到0,就再从设备上获取一批数据存储到数组中
  34.                 return ch;
  35.         }
  36.         /**
  37.          * 读取一行文本
  38.          */
  39.         public String myReadLine() throws IOException{
  40.                 //定义临时缓冲区,用于存储一行文本
  41.                 StringBuilder sb=new StringBuilder();
  42.                 //不断地调用myRead方法从缓冲区中取出数据
  43.                 int ch=0;
  44.                 while((ch=myRead())!=-1){
  45.                         //在储存前要判断行终止符
  46.                         if(ch=='\r')
  47.                                 continue;
  48.                         if(ch=='\n')
  49.                                 return sb.toString();
  50.                         //对读到的字符进行临时存储
  51.                         sb.append((char)ch);
  52.                 }
  53.                 //如果文本结尾处有数据,但没有行终止符。
  54.                 //数据已读到,并存储到StringBuilder中,只要判断StringBuilder长度即可。
  55.                 if(sb.length()!=0)
  56.                         return sb.toString();
  57.                 return null;
  58.         }
  59.         /**
  60.          * 定义一个缓冲区的关闭方法
  61.          * @throws IOException
  62.          */
  63.         public void myClose() throws IOException{
  64.                 //其实就是在关闭被缓冲的流对象
  65.                 r.close();
  66.         }
  67. }
复制代码




9 个回复

倒序浏览
这里看应该不可以吧,return -1应该返回的整数,用字符接收不了
回复 使用道具 举报
不能的。。。用int 的原因是 读数据的原理是返回字节byte类型的。。。里面有一个强转的动作来取得int后8位的
回复 使用道具 举报
如果你硬要该应该也是可以得,不过你代码救得动大手术才行了
回复 使用道具 举报
可以改成char ,但你的返回值不能超过char的取值范围是0~65535,你这里返回的是-1,不在char的取值范围内
回复 使用道具 举报
稍微岔开一下话题,问一个关于字符集的问题。我们知道,UTF-8是用3个字节表示一个字符,而char类型是2个字节,最后怎么转成char类型?
回复 使用道具 举报
最好不要改。。
回复 使用道具 举报
kamo 中级黑马 2015-10-13 21:46:52
8#
@白纸嘿字@ 发表于 2015-10-13 00:05
稍微岔开一下话题,问一个关于字符集的问题。我们知道,UTF-8是用3个字节表示一个字符,而char类型是2个字 ...

char是Unicode码,通过查表,转成 utf-8. 那转回去,查表不就行了?
回复 使用道具 举报
beiji 中级黑马 2015-10-20 11:39:17
9#
我觉得可以改,
public char myRead() throws IOException{
                if(count==0){
                //通过被缓冲的流对象的read方法,就可以将设备上的数据存储到数组中
                count=r.read(buffer);
                index=0;//执行这个操作,是不是因为index自增到最后一个了,所以这个就要把index归零
                }
                if(count<0)
                        return -1;
                char ch=buffer[index];
                index++;//每取一次都要自增
                count--;//取出一个,数组的数量就要减少。一旦减到0,就再从设备上获取一批数据存储到数组中
                return ch;
        }
只需要把if中的return中的语句改成 return  a;前提是你别的代码中没有用到这个-1,要是你别的代码中用到,那就也得改别的代码
回复 使用道具 举报
int和char是可以互转的。所以是可以的。用强转是可以的。而且字符在ASCII表里都有对应的int数值
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马