黑马程序员技术交流社区

标题: StringBuffer的toString问题 [打印本页]

作者: 何超    时间: 2013-11-26 23:49
标题: StringBuffer的toString问题
本帖最后由 何超 于 2013-11-27 09:36 编辑


实在累趴了 = = 没劲把这个代码敲出来了  截图之后把问题也写上了
我试过了  toString()不会清空StringBuffer 那为什么每次的输出都只是当前行!!!API也查了 StringBuff的toString没有什么特异的地方!!!

作者: 何超    时间: 2013-11-26 23:52
擦 图片这么小···还是自己敲代码好了
public String myReaderLine()
        {
                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);
                }
        }
问题是  为什么 sb.toString()每次都只返回一行  照理来说  事实是一直再往sb中存数据
那么当循环到第二次的时候  toString返回的应该就是 第一行+第二行的数据啊  可是还是只有第二行的
同理第三行也只有第三行本身的 没有一二行的  为什么!  循环内并没有清除sb中的元素让其归0啊!!!
作者: 衣带赞    时间: 2013-11-27 00:58
本帖最后由 衣带赞 于 2013-11-27 01:08 编辑

你这个myReadLine()是一个函数,当你每调用一次这个函数的时候,都会执行
StringBuilder sb = new StringBuilder();这句话,也就是说你每次都新创建了一个StringBuilder容器,并用变量名sb指向其地址值。所以执行return sb.toString();时,必然只返回当前所加入的字符。
如果你想将之前的内容全部返回,就不能在函数体里面创建StringBuilder类,而应该在外部调用函数中创建,并且把这个容器sb作为参数传递给这个函数。
比如:
  1. public String myReaderLine(StringBuilder sb)
  2.         {
  3.                 int ch = 0;
  4.                 while((ch=fr.read())!=-1)
  5.                 {
  6.                         if(ch=='\r')
  7.                                 continue;
  8.                         if(ch=='\n')
  9.                                 return sb.toString();
  10.                         else
  11.                         sb.append((char)ch);
  12.                 }
  13.         }
复制代码
你这里忽略了一个问题,就是在局部变量中创立的对象并不具有全局效应,当函数结束后就退出内存。
打个最简单的比方:
    for(int a=1; a<5; a++);
    System.out.println(a);
这个代码就是错误的,因为找不到符号a,for循环体创立的变量和函数内创立的类是一个道理。不具有全局的作用范围。而:
     int a = 1;
     for(a=1; a<5; a++);
     System.out.println(a);
就是正确的代码,只有在for循环外面创建a才有用,这个就比较清楚了吧。




作者: 樊志伟    时间: 2013-11-27 09:44
本帖最后由 樊志伟 于 2013-11-27 10:26 编辑

不是楼上说的问题,主要是楼主的while循环有问题
把楼主的改成这样就ok了
  1. public String myReadLine()
  2. {
  3.         int ch=0;
  4.         while((ch=fr.read())!=-1)
  5.         {
  6.                 sb.append((char)ch);
  7.         }
  8.         return sb.toString();
  9. }
复制代码

只要没有读到文件结尾就会一直读一直存,到了文件结尾会自动跳出循环,最后返回整个读取到的字符就行了,


作者: 樊志伟    时间: 2013-11-27 10:29
版主,求加分~~~~{:soso__1039173773029404865_2:}
作者: HAnG    时间: 2013-11-27 10:57
简单地说,就是函数内的变量是会自动释放内存的。
作者: 何超    时间: 2013-11-27 14:24
樊志伟 发表于 2013-11-27 09:44
不是楼上说的问题,主要是楼主的while循环有问题
把楼主的改成这样就ok了

你这样就是一次性输出所有了 不会一行一行的输出 = =
作者: hurryup    时间: 2013-11-27 20:26
把while((ch=fr.read())!=-1)改成while(true)就可以了
作者: 衣带赞    时间: 2013-11-27 20:54
樊志伟 发表于 2013-11-27 09:44
不是楼上说的问题,主要是楼主的while循环有问题
把楼主的改成这样就ok了

。。。  你没看到楼主函数的名字吗?是myReadLine(),是用来代替readLine()方法的,你这个是读取一行数据的代码吗?你完全把楼主的方法都改了。而且你这里面连容器都没定义,也没传入容器,sb从哪里出来的?看题目详细点啊,要不会误导新人。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2