黑马程序员技术交流社区
标题:
BufferedReader
[打印本页]
作者:
@白纸嘿字@
时间:
2015-10-12 01:51
标题:
BufferedReader
本帖最后由 @白纸嘿字@ 于 2015-10-12 01:53 编辑
这是毕向东模拟BufferedReader写的,看后有一个问题想问一问,就是25行的“int”,能不能改成char?
package com.itheima.io.buffer;
import java.io.IOException;
import java.io.Reader;
public class MyBufferedReader {
//持有一个流对象
private Reader r;
//因为是缓冲区对象,所以内部必须维护了一个数组
private char[] buffer=new char[1024];
//定义角标
private int index=0;
//定义变量,记录住数组中元素的个数
private int count=0;
//一初始化就必须明确被缓冲的流对象
public MyBufferedReader(Reader r) {
super();
this.r = r;
}
/**
* 读取一个字符的方法,而且是高效的
* @throws IOException
*/
public int 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;
}
/**
* 读取一行文本
*/
public String myReadLine() throws IOException{
//定义临时缓冲区,用于存储一行文本
StringBuilder sb=new StringBuilder();
//不断地调用myRead方法从缓冲区中取出数据
int ch=0;
while((ch=myRead())!=-1){
//在储存前要判断行终止符
if(ch=='\r')
continue;
if(ch=='\n')
return sb.toString();
//对读到的字符进行临时存储
sb.append((char)ch);
}
//如果文本结尾处有数据,但没有行终止符。
//数据已读到,并存储到StringBuilder中,只要判断StringBuilder长度即可。
if(sb.length()!=0)
return sb.toString();
return null;
}
/**
* 定义一个缓冲区的关闭方法
* @throws IOException
*/
public void myClose() throws IOException{
//其实就是在关闭被缓冲的流对象
r.close();
}
}
复制代码
作者:
wangguoxin
时间:
2015-10-12 08:52
这里看应该不可以吧,return -1应该返回的整数,用字符接收不了
作者:
年强
时间:
2015-10-12 10:04
不能的。。。用int 的原因是 读数据的原理是返回字节byte类型的。。。里面有一个强转的动作来取得int后8位的
作者:
didixyy
时间:
2015-10-12 13:38
如果你硬要该应该也是可以得,不过你代码救得动大手术才行了
作者:
chengaq0
时间:
2015-10-12 14:34
可以改成char ,但你的返回值不能超过char的取值范围是0~65535,你这里返回的是-1,不在char的取值范围内
作者:
@白纸嘿字@
时间:
2015-10-13 00:05
稍微岔开一下话题,问一个关于字符集的问题。我们知道,UTF-8是用3个字节表示一个字符,而char类型是2个字节,最后怎么转成char类型?
作者:
王海中
时间:
2015-10-13 18:38
最好不要改。。
作者:
kamo
时间:
2015-10-13 21:46
@白纸嘿字@ 发表于 2015-10-13 00:05
稍微岔开一下话题,问一个关于字符集的问题。我们知道,UTF-8是用3个字节表示一个字符,而char类型是2个字 ...
char是Unicode码,通过查表,转成 utf-8. 那转回去,查表不就行了?
作者:
beiji
时间:
2015-10-20 11:39
我觉得可以改,
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,要是你别的代码中用到,那就也得改别的代码
作者:
LOVE毛豆豆
时间:
2015-10-29 20:41
int和char是可以互转的。所以是可以的。用强转是可以的。而且字符在ASCII表里都有对应的int数值
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2