——- android培训、java培训、期待与您交流! ———-
练习:自定义一个字符读取流缓冲区,并演示
原理分析:
BufferedReader中的readLine方法其实还是调用了read方法.
原理就是read+数组
在本例为了我们采用StringBuilder代替数组
所以,我的自定义字符读取流缓冲区原理就是:
StringBuilder+Reader类的read方法.
步骤:
1 自定义一个字符读取流缓冲区类,继承Reader类
2 读取一个java文件进行演示
如何实现步骤1呢?
1.1 继承Reader类
1.2 覆盖Reader类中的抽象方法close(),read(char[] buf,int off, int length)
1.3 自定义构造函数,形式参数包含FileReader
1.4 自定义readLine方法和close方法
1.5 在功能上声明异常.注意异常的处理原则:谁调用谁处理,所以对于自定义功能,应当声明,不应当try
import java.io.*;
class MyBufferedReader extends Reader
{
private FileReader fr;//声明文件字符读取流对象
//自定义构造函数,包装FileReader对象
MyBufferedReader(FileReader fr)
{
this.fr = fr;
}
//覆盖Reader的抽象方法
//覆盖close()
public void close() throws IOException
{
fr.close();
}
//覆盖read(char[] buf,int off, int length)
public int read(char[] buf,int off, int length)throws IOException
{
//读取数组中的一部分字符
//因为FileReader继承自InputStreamReader类,该类实现了此方法,所以只要调用即可
return fr.read(buf,off,length);
}
//自定义readLine方法
//通过下列字符之一即可认为某行已终止:换行 ('\n')、回车 ('\r') 或回车后直接跟着换行。
public String myReadLine()throws IOException
{
//创建字符串缓冲区
StringBuilder sb = new StringBuilder();
int ch = 0;
while((ch=fr.read())!=-1)
{
if(ch=='\r')
continue;//读到回车符,该行结束
if(ch=='\n')
return sb.toString();//读到换行符,该行结束
else
sb.append((char)ch);//否则该行没结束,把字符添加到缓冲区
}
if(sb.length()!=0)
return sb.toString();//如果最后一行没有换行,返回该行,结束
return null;//定义结束标记:null,表示读到结尾了
}
//自定义close方法
public void myClose()throws IOException
{
fr.close();
}
}
public class MyBufferedReaderDemo
{
public static void main(String[] args)
{
MyBufferedReader myBuf = null;//声明自定义字符串缓冲区读取流对象,
try
{
//创建自定义字符串缓冲区读取流对象,
myBuf = new MyBufferedReader(new FileReader(new File("BufferedWriterDemo.java")));
//声明读取行
String line = null;
//循环读取行,并打印在控制台
while((line=myBuf.myReadLine())!=null)
{
System.out.println(new String(line));
}
}
catch (IOException e)
{
System.out.println(e.toString());
}
finally
{
if(myBuf!=null)
try
{
myBuf.myClose();
}
catch (IOException ex)
{
System.out.println(ex.toString());
}
}
}
}