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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 罗凯健 中级黑马   /  2013-9-27 11:08  /  3936 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

实现原理大家都知道,毕老师也有说过,但是实现代码部分他用的是stringbuffer代替char[]数组说比较简单。我想尝试自己写一下这个实现部分,结果出了问题:
  1. public String MyReadline() throws IOException{
  2.                 char[] sbf=new char[1024];
  3.                 int len=0;
  4.                 while((len=i.read(sbf))!=-1){
  5.                         if(sbf[len-1]=='\n'){
  6.                                 if(sbf[len-2]=='\r')
  7.                                         return (new String(sbf,0,len));       
  8.                                 else
  9.                                         continue;
  10.                         }else
  11.                                 continue;
  12.                 }
  13.                 return null;
  14.         }
复制代码
这就是读方法,但是我调用这个方法的时候,一直是返回null值,哪位能帮忙查一下源代码(我没有)或者指出我写的代码哪部分不对吗?谢谢。。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

5 个回复

倒序浏览
  1. while((len=i.read(sbf))!=-1){
  2.                         if(sbf[len-1]=='\n'){
  3.                                 if(sbf[len-2]=='\r')
  4.                                         return (new String(sbf,0,len));        
  5.                                 else
  6.                                         continue;
  7.                         }else
  8.                                 continue;
复制代码
这个部分,你定义的数组长度是固定的1024,如果你读的一行数据不多,比如带回车一共几十个字符。
你的判断是判断数组最后两个角标位的值。显然数据没那么长,最后两个角标位的值不为'\n'和'\r'。那循环结束后就为返回null了。所以要判断就判断读取到的字符的值,而不是数组最后两位的值。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 罗凯健 于 2013-9-27 11:34 编辑
胡智 发表于 2013-9-27 11:27
这个部分,你定义的数组长度是固定的1024,如果你读的一行数据不多,比如带回车一共几十个字符。
你的判断 ...

我的想法是。。每读一个字符判断一次,应该不会出现长度影响的情况吧。。
回复 使用道具 举报
罗凯健 发表于 2013-9-27 11:31
我的想法是。。每读一个字符判断一次,应该不会出现长度影响的情况吧。。
...

但是你代码判断的是数组最后的两位的值而不是读取到的数据。你再看看代码吧。
回复 使用道具 举报
哥们,我按照你的代码写了一遍.
  1. import java.io.*;
  2. class bufferDemo
  3. {
  4.         private static FileReader i=null;
  5.         public static void main(String[] args)throws Exception{
  6.          i=new FileReader("StringDemo.java");
  7.         System.out.println(MyReadline());
  8.        
  9.         }

  10.         public static String MyReadline() throws IOException{
  11.                 char[] sbf=new char[1024];
  12.                 int len=0;
  13.                 while((len=i.read(sbf))!=-1){System.out.println(len);
  14.                         if(sbf[len-1]=='\n'){
  15.                                 if(sbf[len-2]=='\r')
  16.                                         return (new String(sbf,0,len));        
  17.                                 else
  18.                                         continue;
  19.                         }else
  20.                                 continue;
  21.                 }
  22.                 return null;
  23.         }
  24. }
复制代码
你我看到了这个
1024
1024
669//这三个数字是len的值,下面都是正常的读取.  可见,在文章没有读取完之前,它都是1024的读取.并没有顾忌到回车.
始, 三个存入.
                sop(s);
        }
        public static void method_get()
        {
                String str = "abcdefa";
                sop(str.length());


                //根据索引获取字符.
                sop(str.charAt(2));


--------------------------------------------------------还有一句就是 if(sbf[len-1]=='\n')
这if内的语句是访问不到的,不信你放进一个System.out.println("1");试试

具体原因我也没仔细想过,关于这一章我也有点模棱两可.不过你要是做出来了,回答我一下.

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
jìng╮煜 发表于 2013-9-27 13:00
哥们,我按照你的代码写了一遍.你我看到了这个
1024
1024

懂了,看来有空还是得去下载源代码来瞧瞧
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马