A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 何超 中级黑马   /  2013-11-26 23:49  /  3220 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 何超 于 2013-11-27 09:36 编辑


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

8 个回复

倒序浏览
擦 图片这么小···还是自己敲代码好了
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啊!!!

评分

参与人数 1技术分 +1 黑马币 +2 收起 理由
简★零度 + 1 + 2 淡定

查看全部评分

回复 使用道具 举报
本帖最后由 衣带赞 于 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才有用,这个就比较清楚了吧。



评分

参与人数 1技术分 +1 收起 理由
贺奕凯 + 1 鼓励

查看全部评分

回复 使用道具 举报
本帖最后由 樊志伟 于 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. }
复制代码

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

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
版主,求加分~~~~{:soso__1039173773029404865_2:}
回复 使用道具 举报
简单地说,就是函数内的变量是会自动释放内存的。

评分

参与人数 1黑马币 +3 收起 理由
简★零度 + 3 亲,不要水啊。多写点啊

查看全部评分

回复 使用道具 举报
何超 中级黑马 2013-11-27 14:24:31
7#
樊志伟 发表于 2013-11-27 09:44
不是楼上说的问题,主要是楼主的while循环有问题
把楼主的改成这样就ok了

你这样就是一次性输出所有了 不会一行一行的输出 = =
回复 使用道具 举报
hurryup 高级黑马 2013-11-27 20:26:47
8#
把while((ch=fr.read())!=-1)改成while(true)就可以了
回复 使用道具 举报
樊志伟 发表于 2013-11-27 09:44
不是楼上说的问题,主要是楼主的while循环有问题
把楼主的改成这样就ok了

。。。  你没看到楼主函数的名字吗?是myReadLine(),是用来代替readLine()方法的,你这个是读取一行数据的代码吗?你完全把楼主的方法都改了。而且你这里面连容器都没定义,也没传入容器,sb从哪里出来的?看题目详细点啊,要不会误导新人。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马