- //通过装饰者模式设计一个自定义字符流缓冲区,注意不是字节流缓冲区
- class myBufferedReader{
- private FileReader fr;
- public myBufferedReader(FileReader fr){
- this.fr = fr;
- }
- //读取完一行自动换行,读取到最后一个字符返回null
- public String readLine() throws IOException{
- StringBuilder sb = new StringBuilder();
- int num = 0;
- while((num = this.fr.read()) != -1){ //调用Reader中read方法,读取单个字符并返回;如果读到流末尾,则返回-1
- if(num == '\r'){
- continue;
- }
- if(num == '\n'){
- return sb.toString();
- }
- else{ //如果既不是'\r'也不是'\n'的话,就把之前读取的字符强转后存入StringBuilder
- sb.append((char)num); //把数字转换成字符并追加到字符串缓冲区
- }
- }
- //如果文本的最后一行没有“回车”的话,sb.toString()是不会返回的,也就是最后一行是打印不出来的
- //所以这里要增加一个判断,即如果最后一行没有“回车”的话,手动返回
- if(sb.length() > 0){ //如果字符串缓冲区有内容(返回的是字符数),则手动返回
- return sb.toString(); //也就是说,当read返回-1时,说明读取结束,但是由于没有回车的存在导致存储在字符串缓冲区中的字符没有被返回,所以需要手动返回
- }
-
- //如果读取到-1的话结束while循环,说明流结束,则返回null,疑问??这个return null何时才能执行到?
- return null;
- }
- //定义一个关闭资源的方法,内部其实关闭的是FileReader
- public void close() throws IOException{
- fr.close();
- }
- }
复制代码 如果文本文件的最后一行没有“回车”,就不会返回最后一行的内容,所以代码在return null前会再判断并手动返回一次,但是如果最后一行有回车,那岂不是最后一行文本字符返回了两次?我在代码运行时,我的疑惑现象却没有出现,求解释???
|
|