黑马程序员技术交流社区
标题:
【在io流中自定义的缓冲区去实现readLine方法中的疑点】
[打印本页]
作者:
wkz_crystal
时间:
2015-3-25 20:36
标题:
【在io流中自定义的缓冲区去实现readLine方法中的疑点】
import java.io.*;
class MyBufferRead
{
private FileReader fr;
MyBufferRead(FileReader fr)
{
this.fr=fr;
}
public String myReadLine() throws IOException
{
/*
我们知道在缓冲区中readLine的方法返回是一行的字符串,内存模拟可以通过数组去
接受,并且返回,但是这样不好控制,所以我们直接用StringBuilder来完成,这种动态的
返回字符串,非常便捷,而且简单,所以这里就定义了一个容器
*/
StringBuilder sb=new StringBuilder();
//通过读取单个字符的方式去进行一一读取
int ch=0;
//判断的条件就是当不为-1时,仍然循环去读取
while ((ch=fr.read())!=-1)
{
if (ch=='\r') //当读取到回车是跳过此循环继续进行下一个循环
{
continue;
}
if (ch=='\n')//当读取到换行的时候,那么就返回容器中已经存在内容(即为一行)
{
return sb.toString();
}else
{
sb.append((char)ch); //把读取的一行数据添加到容器中临时存起来
}
}
if (sb.length()!=0) //最后如果容器中内容长度不为0,那么全部返回
{
return sb.toString();
}
return null; //否则返回为null
}
public void myClose() throws IOException //模仿的是关闭缓冲区流的方法
{
fr.close();
}
}
class MyBufferedReader4
{
public static void main(String[] args) throws IOException
{
//下面的内容很简单了,就是调用自己的方法去执行,最终把读取出来的内容显示在屏幕上
FileReader fr=new FileReader("MyBufferedReader4.java");
MyBufferRead mr=new MyBufferRead(fr);
String line=null;
while ((line=mr.myReadLine())!=null)
{
sop(line);
}
mr.myClose(); //关闭缓冲区流对象
}
public static void sop(Object obj)
{
System.out.println(obj);
}
}
复制代码
关于这里的代码想了很久还是不能很好的理解,在以上的循环中,因为sb容器中已经返回了内容了,为什么这里还要进行判断!
if (sb.length()!=0) //最后如果容器中内容长度不为0,那么全部返回
{
return sb.toString();
}
作者:
奔跑的猴子
时间:
2015-3-25 20:57
视频没有好好看啊你,毕老师特意说过这点。
读取文本的时候,最后一行结束的时候,如果没有换行符,那么最后一行的内容就不会被输出,
为了防止这种情况,就算读取到最后没有读到换行符,只要读取到了数据,都返回就好了。
作者:
圣光忏悔
时间:
2015-3-26 00:34
但是文本可能只有换行符没有内容,所以上面的toString返回的为空,所以再在下面判断一下.
作者:
夜班心桥
时间:
2015-3-26 10:21
假设你读取的java文件的最后一行是"}",而没有换行符,此时fr读取到了该字符,然后进行判断,既不是"\r",也不是“\n”,所以它会把“}”放到StringBuilder中,然后读到行的末尾了,就退出while循环,如果不再while的外面对StringBuilder的长度做判断的话,最后一行的"}"是打印不出来的。所以,必须判断长度是否为0,如果不为0,再将StringBuilder转化成字符串返回给调用者。希望,对您的理解有点帮助。
作者:
wkz_crystal
时间:
2015-4-1 16:17
奔跑的猴子 发表于 2015-3-25 20:57
视频没有好好看啊你,毕老师特意说过这点。
读取文本的时候,最后一行结束的时候,如果没有换行符,那么最 ...
呵呵,明白了……谢谢!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2