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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 何伟 中级黑马   /  2013-3-4 12:21  /  2084 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. import java.io.FileReader;
  2. import java.io.IOException;

  3. public class MyBufferedReaderTest {
  4.         public static void main(String[] args) throws IOException {
  5.                 MyBufferedReader mbr = new MyBufferedReader(new FileReader("Copy.txt"));

  6.                 String line = null;
  7.                 while ((line = mbr.readLine()) != null) {
  8.                         System.out.println(line);
  9.                 }

  10.                 mbr.close();
  11.         }

  12. }
复制代码
  1. import java.io.IOException;
  2. import java.io.Reader;

  3. /*
  4. * 模拟BufferedReader的readLine(),close()方法。
  5. */
  6. public class MyBufferedReader {
  7.         private Reader r;
  8.         private int count;
  9.         public MyBufferedReader(Reader r) {
  10.                 this.r = r;
  11.         }

  12.         // 模拟readLine
  13.         public String readLine() throws IOException {
  14.                 int ch = 0;
  15.                 // 定义一个容器
  16.                 StringBuilder sb = new StringBuilder();
  17.                 while ((ch = r.read()) != -1) {
  18.                         if (ch == '\r') {
  19.                                 continue;
  20.                         }
  21.                         if (ch == '\n') {
  22.                                 return ++count+sb.toString(); //haha0.toString();  haha0
  23.                         } else {
  24.                                 //如果你不是\r,也不是\n,那么就把数据保存起来
  25.                                 sb.append((char)ch); //haha9
  26.                         }
  27.                 }
  28.                
  29.                 //判断sb里面是否还有数据
  30.                 if(sb.length()>0){
  31.                         return ++count+sb.toString();
  32.                 }
  33.                
  34.                 return null;
  35.         }

  36.         // 模拟close方法
  37.         public void close() throws IOException {
  38.                 r.close();
  39.         }
  40. }
复制代码
为什么在目标文件最后几行全是空行时候会少读一行,如果最后一行不是空白就不会有这种问题?不知道我哪里出问题了

123 (1).png (11.2 KB, 下载次数: 0)

123 (1).png

123 (2).png (9.64 KB, 下载次数: 49)

123 (2).png

评分

参与人数 1技术分 +1 收起 理由
李培根 + 1 神马都是浮云

查看全部评分

6 个回复

倒序浏览
根据你的readLine(),你最后一行如果没有‘\r’'\n'也没有字符的话(sb.length()=0),j就会返回null。
问题就是,最后一行是空白的,没有回车也没数据,它就返回null了,还没有返回++count呢。
最后一行有数据的话,自然就返回 return ++count+sb.toString();

所以你的问题就是readLine() 最后面  return  ++count;
回复 使用道具 举报
李志卫 发表于 2013-3-4 13:06
根据你的readLine(),你最后一行如果没有‘\r’'\n'也没有字符的话(sb.length()=0),j就会返回null。
问题 ...

return  ++count;不行啊
回复 使用道具 举报
何伟 发表于 2013-3-4 13:12
return  ++count;不行啊

不好意思,的确有欠思考,运行这个吧。

  1. import java.io.*;
  2. import java.util.*;



  3. public class MyBufferedReaderTest {

  4.         public static void main(String[] args) throws IOException {

  5.                 MyBufferedReader mbr = new MyBufferedReader(new FileReader("D:\\java\\EditPlus 3\\codepage.txt"));



  6.                 String line = null;

  7.                 while ((line = mbr.readLine()) != null) {

  8.                         System.out.println(line);

  9.                 }



  10.                 mbr.close();

  11.         }



  12. }






  13. /*

  14. * 模拟BufferedReader的readLine(),close()方法。

  15. */

  16. class MyBufferedReader {

  17.         private Reader r;

  18.         private int count;
  19.                 static int n = 0;

  20.         public MyBufferedReader(Reader r) {

  21.                 this.r = r;

  22.         }



  23.         // 模拟readLine

  24.         public String readLine() throws IOException {

  25.                 int ch = 0;
  26.                                

  27.                 // 定义一个容器

  28.                 StringBuilder sb = new StringBuilder();

  29.                 while ((ch = r.read()) != -1) {

  30.                         if (ch == '\r') {

  31.                                 continue;

  32.                         }

  33.                         if (ch == '\n') {

  34.                                 return ++count+sb.toString(); //haha0.toString();  haha0

  35.                         } else {

  36.                                 //如果你不是\r,也不是\n,那么就把数据保存起来

  37.                                 sb.append((char)ch); //haha9

  38.                         }
  39.                                                

  40.                 }

  41.                

  42.                 //判断sb里面是否还有数据

  43.                 if(sb.length()>0){
  44.                                        
  45.                         n = 1;
  46.                         return ++count+sb.toString();

  47.                 }
  48.                                 else
  49.                            {
  50.                                         if(n==0)
  51.                                 {
  52.                      n =1;
  53.                                         return (++count)+"";

  54.                                 }
  55.                                         return  null;
  56.                           }

  57.                
  58.              //return null;  
  59.                

  60.         }



  61.         // 模拟close方法

  62.         public void close() throws IOException {

  63.                 r.close();

  64.         }

  65. }
复制代码
就是最后一行空的时候加一行号,思想就是这样。具体实现看你的方法。
我这里就随便用了一种方法,凑合着用。
回复 使用道具 举报
李志卫 发表于 2013-3-4 14:35
不好意思,的确有欠思考,运行这个吧。就是最后一行空的时候加一行号,思想就是这样。具体实现看你的方法 ...

谢了,还可以这样:)
回复 使用道具 举报
何伟 发表于 2013-3-4 13:12
return  ++count;不行啊

最后一行无任何字符估计打印不出来,你加上几个空白符能打印出来...
回复 使用道具 举报
赵文 发表于 2013-3-4 15:00
最后一行无任何字符估计打印不出来,你加上几个空白符能打印出来...

我试试..........................
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马