查阅api发现,如果没有定义缓冲区,每次读取后,都要将数据从字节转换成字符数据而后返回,这样会效率极低.
个人认为:
不管是字节流还是字符流,底层都是在读取字节.只是字符流加入了一个可以让我们识别的一个编码表.如果一次读一个字符,先存储起来,等到读到行末尾再一次输出.
那么效率应该是提高在"数据返回"这个关键点上.而在底层读取啊,还有转换呀,
这些方面是没有提高效率的.
* */
public class Demo06 {
public static void main(String[] args) throws IOException {
File fi = new File("c:\\stu.txt");
String s = LineFile(fi);
System.out.println(s);
}
public static String LineFile(File fi) throws IOException {
MyLineReader mr = new MyLineReader(new FileReader(fi));
String s = null;
StringBuilder sb = new StringBuilder(); //为了让程序拥有自主控制输出,因此创建.
mr.setLen(0); //设置开始行号.
while((s = mr.MyreadLine())!= null)
{
sb.append( mr.getLen() + ":" + s + "\r\n");
}
return sb.toString(); //将数据返回,让客户拥有输出权利.
}
}
class MyLineReader
{
private int len; //自定义行数变量
private Reader fi; //读取数据流.
public MyLineReader(Reader fi)
{
this.fi = fi;
}
public String MyreadLine() throws IOException
{
len ++; //读取一行之后,len自增.
StringBuilder sb = new StringBuilder(); //将数据存储起来.
int i = 0;
while((i = fi.read())!= -1)
{
if(i == '\r')
continue;
if(i == '\n') //当独到行标记时候,将数据全部返回.
return sb.toString();
sb.append((char)i); //没有到达行标记就继续读取.
}
if(sb.length() != 0) //StringBuilder的长度不为0,就继续返回数据.
return sb.toString();
return null; //否则返回空.因为调用方法时候,是依靠返回是不是null来判断,是不是应该结束.
}
public int getLen() { //get,set方法,用来获取行号和设置行号.
return len;
}
public void setLen(int len) {
this.len = len;
}
}