本帖最后由 ysdolls 于 2014-8-8 08:55 编辑
老毕写错了?io流MyBufferedReaderDemo 第19天 第五个视频12分20秒运行的程序
看的时候就感觉输出应该重复了 readline应该是调用一次读一行 如读取数据为:
abcd1
abcd2
abcd3
则调用三次readline 不加换行的话输出应为:
abcd1abcd2abcd3
加了就和读取的一样
老毕视频里也确实对了,和读取内容一样是三行,可发出来的源代码运行后却不是这样输出的 如下:
asdk1 asdk1asdk2 asdk1asdk2asdk3 asdk1asdk2asdk3asdk4 asdk1asdk2asdk3asdk4asdk5 因为每次读数据都没清空StringBuilder 所以每次输出都带着之前所有读过的 虽然源代码老毕进行了 继承 重写代码的完善 可主要功能部分没有变,为何视频里输出正确,而相同代码再运行却出现了这样的情况呢? 有大神能来分析一下 数据读取的过程嘛?总结问题如下: 1.我不明白了,StringBuilder是在方法里定义的,应该每次调用 都new了一个StringBuilder,都是不同的StringBuilder,可为什么输出的sb一直带有之前读取的? 2.sun的readLine是一个数组一个数组的读一行数据到内存中。然后write方法通过write调用flush()方法将内存中的数据存入文件。而老毕的是一个字符一个字符的读到内存中来凑够一行。根本和直接调用read方法是一样的,重写readline没有了意义。 3.我看了一下String line 每次指向的字符串如下: asdk1 asdk1asdk2 asdk1asdk2asdk3 asdk1asdk2asdk3asdk4 asdk1asdk2asdk3asdk4asdk5 所以 String line 每次被赋予的字符串就是 方法每次被调用返回的字符串。很明显 方法内部 的StringBuilder sb =new StringBuilder();每次都是一个对象没有新的引用覆盖。
请大神详细讲解数据的流向内存的步骤,学了一天 脑袋有点迷糊。 我用的是去深圳黑马领导的光盘里的内容 粘贴出程序如下:
- /*
- 明白了BufferedReader类中特有方法readLine的原理后,
- 可以自定义一个类中包含一个功能和readLine一致的方法。
- 来模拟一下BufferedReader
- */
- import java.io.*;
- class MyBufferedReader extends Reader
- {
-
- private Reader r;
- MyBufferedReader(Reader r)
- {
- this.r = r;
- }
- //可以一次读一行数据的方法。
- public String myReadLine()throws IOException
- {
- //定义一个临时容器。原BufferReader封装的是字符数组。
- //为了演示方便。定义一个StringBuilder容器。因为最终还是要将数据变成字符串。
- StringBuilder sb = new StringBuilder();
- int ch = 0;
- while((ch=r.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;
- }
- /*
- 覆盖Reader类中的抽象方法。
- */
- public int read(char[] cbuf, int off, int len) throws IOException
- {
- return r.read(cbuf,off,len) ;
- }
- public void close()throws IOException
- {
- r.close();
- }
- public void myClose()throws IOException
- {
- r.close();
- }
- }
- class MyBufferedReaderDemo
- {
- public static void main(String[] args) throws IOException
- {
- FileReader fr = new FileReader("buf.txt");
- MyBufferedReader myBuf = new MyBufferedReader(fr);
- String line = null;
- while((line=myBuf.myReadLine())!=null)
- {
- System.out.println(line);
- }
- myBuf.myClose();
- }
- }
复制代码
|