黑马程序员技术交流社区

标题: FileReader 字符IO的一个小问题 [打印本页]

作者: xyf19881010    时间: 2015-2-16 14:19
标题: FileReader 字符IO的一个小问题
FileReader里面有一个叫做readLine()的特有功能,就是一次读取一行:所谓一行就是末尾以\r\n(windows情况)结束的一段字符。我的疑问是:我们自己编写的例如.txt文件并没有在最后一行来个\r\n呀。那么FileReader读到最后尾巴那一小行字符的时候是怎么判定结束获得了一行数据的?难道是文本结尾默认有个\r\n?往各位大神指点
作者: mengxiang1993    时间: 2015-2-16 15:01
readLine()方法内部已经解决了你所说的问题,如果最后一行数据没有换行,在readLine()的内部,会判断
if(s.length()!=0) return s; 那么即使最后一行数据没有/r/n,也会返回最后一行数据
作者: lwj123    时间: 2015-2-16 17:34
这时刘意老师视频讲解的模拟readLine方法:
  1. package lwj_8;

  2. import java.io.IOException;
  3. import java.io.Reader;

  4. /*
  5. * 用Reader模拟BufferedReader的readLine()功能
  6. *
  7. * readLine():一次读取一行,根据换行符判断是否结束,只返回内容,不返回换行符
  8. */
  9. public class MyBufferedReader {
  10.         private Reader r;

  11.         public MyBufferedReader(Reader r) {
  12.                 this.r = r;
  13.         }

  14.         /*
  15.          * 思考:写一个方法,返回值是一个字符串。
  16.          */
  17.         public String readLine() throws IOException {

  18.                 /*
  19.                  * 我要返回一个字符串,我该怎么办呢? 我们必须去看看r对象能够读取什么东西呢? 两个读取方法,一次读取一个字符或者一次读取一个字符数组
  20.                  * 那么,我们要返回一个字符串,用哪个方法比较好呢? 我们很容易想到字符数组比较好,但是问题来了,就是这个数组的长度是多长呢?
  21.                  * 根本就没有办法定义数组的长度,你定义多长都不合适。 所以,只能选择一次读取一个字符。
  22.                  * 但是呢,这种方式的时候,我们再读取下一个字符的时候,上一个字符就丢失了 所以,我们又应该定义一个临时存储空间把读取过的字符给存储起来。
  23.                  * 这个用谁比较和是呢?数组,集合,字符串缓冲区三个可供选择。
  24.                  * 经过简单的分析,最终选择使用字符串缓冲区对象。并且使用的是StringBuilder
  25.                  */
  26.                 StringBuilder sb = new StringBuilder();
  27.                 /*
  28.                  * hello world java光标在这里,也就是读取到a之后没有\r,\n所以返回的是null,但是此时sb中的数据是为java
  29.                  * 所以要处理数据丢失问题
  30.                  *
  31.                  * 101 102 103 104 105
  32.                  */
  33.                 int ch = 0;
  34.                 while ((ch = r.read()) != -1) {
  35.                         if (ch == '\r') {
  36.                                 // System.out.println("读取到r");
  37.                                 continue;
  38.                         }
  39.                         if (ch == '\n') {
  40.                                 // System.out.println("读取到n");
  41.                                 return sb.toString();
  42.                         } else {
  43.                                 sb.append((char) ch);
  44.                         }
  45.                 }
  46.                 // 为了防止数据丢失,判断sb的长度不能大于0,表示到最后没有换行
  47.                 if (sb.length() > 0) {
  48.                         return sb.toString();
  49.                 }
  50.                 return null;
  51.         }

  52.         public void close() throws IOException {
  53.                 r.close();
  54.         }
  55. }
复制代码

作者: xyf19881010    时间: 2015-2-16 17:51
谢谢版主的答案
作者: 马铃薯    时间: 2015-2-16 18:42
lwj123 发表于 2015-2-16 17:34
这时刘意老师视频讲解的模拟readLine方法:

学习学习!  嘿嘿!




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