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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 陈延真 于 2013-6-2 20:08 编辑

//需求:模拟LineNumberReader类

/*
   模拟除了有readLine()方法和close()方法外。还应该有获取和设置行号的功能。
*/
import java.io.IOException;
import java.io.Reader;

public class MyLineNumberReader {
private Reader r;
private int lineNumber;
public MyLineNumberReader(Reader r) {
  this.r = r;
}
public int getLineNumber() {
  return lineNumber;
}
public void setLineNumber(int lineNumber) {
  this.lineNumber = lineNumber;
}
// 模拟readLine()方法
public String readLine() throws IOException {
  lineNumber++;
   // 定义一个容器
  StringBuilder sb = new StringBuilder(); // sb
    int ch = 0;
  while ((ch = r.read()) != -1) {
   // ch是不是就是读取到的字符
   if (ch == '\r') {
    continue;
   }
   if (ch == '\n') {
    return sb.toString(); // hello
   } else {
    sb.append((char) ch); // hello java
   }
  }
    return null;
}
// 释放资源
public void close() throws IOException {
  r.close();
}
}



//下面是测试类
import java.io.FileReader;
import java.io.IOException;
public class MyLineNumberReaderTest {
public static void main(String[] args) throws IOException {
   MyLineNumberReader mlnr = new MyLineNumberReader2(new FileReader(
    "a.txt"));
  mlnr.setLineNumber(10);
  String line = null;
  while ((line = mlnr.readLine()) != null) {
   System.out.println(mlnr.getLineNumber() + ":" + line);
  }
  mlnr.close();
}
}


评分

参与人数 1技术分 +1 收起 理由
殇_心。 + 1

查看全部评分

4 个回复

倒序浏览
最后一行没有读取到换行符,在判断一下如果没有换行符且是读取返回的为-1就把读取的字符添加到集合中
回复 使用道具 举报
本帖最后由 littlefoxtail 于 2013-6-1 12:47 编辑

public String readLine() throws IOException这个方法中的
因为最后一行没有回车符号,所以不会 return sb.toString();方法直接返回了null
在return null前;得加一句这个
if(sb.length()!=0)
                        return sb.toString();

评分

参与人数 1技术分 +1 收起 理由
殇_心。 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 黑马-许鹏 于 2013-6-1 13:50 编辑

最后一行没有读取到是因为最后一行可能没有回车换行符,那么当执行while ((ch = r.read()) != -1) 判断时,不满足,那么就会return null,所以在执行while ((ch = r.read()) != -1) 不成立时也就是 r.read() = -1时,判断一下字符串缓冲区sb是不是为空,为空则返回null,不为空则返回里面的字符串。代码如下:
  1. import java.io.IOException;
  2. import java.io.Reader;

  3. public class MyLineNumberReader {
  4. private Reader r;
  5. private int lineNumber;
  6. public MyLineNumberReader(Reader r) {
  7.   this.r = r;
  8. }
  9. public int getLineNumber() {
  10.   return lineNumber;
  11. }
  12. public void setLineNumber(int lineNumber) {
  13.   this.lineNumber = lineNumber;
  14. }
  15. // 模拟readLine()方法
  16. public String readLine() throws IOException {
  17.   lineNumber++;
  18.    // 定义一个容器
  19.   StringBuilder sb = new StringBuilder(); // sb
  20.     int ch = 0;
  21.   while ((ch = r.read()) != -1) {
  22.    // ch是不是就是读取到的字符
  23.    if (ch == '\r') {
  24.     continue;
  25.    }
  26.    if (ch == '\n') {
  27.     return sb.toString(); // hello
  28.    } else {
  29.     sb.append((char) ch); // hello java
  30.    }
  31.   }
  32. if(sb.length()==0)
  33.     return null;
  34. else
  35.    return sb.toString();
  36. }
  37. // 释放资源
  38. public void close() throws IOException {
  39.   r.close();
  40. }
  41. }

复制代码

评分

参与人数 1技术分 +1 收起 理由
殇_心。 + 1

查看全部评分

回复 使用道具 举报
如果问题已解决,请及时修改分类,否则继续提问,谢谢合作!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马