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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王薇熔 初级黑马   /  2012-8-2 11:24  /  1797 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

/*
此类为自己写的一个读取行的  字符装饰包装类     我疑惑的是 为什么在最后判断是否 最后一次容器里有没有东西的时候为什么要用length是否=0   而不能用toString是否为null呢?
*/
import java.io.*;
class MyReaderLine
{
private FileReader fr;
MyLineNumber(FileReader fr)
{
  this.fr=fr;
}
public String ReadLine()throws IOException
{
  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);
  }
  if(sb.length()!=0)  //为什么此处要用容器的长度方法呢?  不能这样判断?  if(sb.toString()!=null)  为什么不能这样呢?
   return sb.toString();
  return null;
   
  
}
public void close()throws IOException
{
  fr.close();
}
}

评分

参与人数 1技术分 +1 收起 理由
杨志 + 1 加油!

查看全部评分

4 个回复

正序浏览
黑马-王言龙 发表于 2012-8-2 12:45
来看看StringBuilder的底层实现
public String toString() {
        return new String(value, 0, count) ...

哦  明白了 看了你的回答  谢谢
回复 使用道具 举报
周坤 发表于 2012-8-2 12:22
import java.io.*;
class MyReaderLine
{

我之前也向你说的意思, 但是有个问题就是,即使sb.toString()!=null  结果始终是true 那该if代码也只执行一次  
上面的while循环也已经结束了才能执行到的啊  为什么 在调用的时候 while不停止呢?
回复 使用道具 举报
本帖最后由 黑马-王言龙 于 2012-8-2 13:11 编辑

来看看StringBuilder的底层实现
public String toString() {
        return new String(value, 0, count);
}

StringBuilder sb = new StringBuilder();每读一行,都会创建一个新的sb指向对象。

sb.toStirng() 得到的是一个String类型的对象。要使对象为null,则只有一种可能性,即该对象不存在
所以sb.toString() != null这个逻辑表达式,永为true;

if (sb.toString() != null)
   return sb.toString();//程序运行,读完文本后,将一直返回空内容的String对象


下面是我调用你的MyReader写的测试代码:
public static void main(String[] args) throws Exception {
  MyReader mr = new MyReader(new FileReader("G:\\Demo.java"));
  PrintWriter pw = new PrintWriter(System.out, true);
  String line = null;
  while((line=mr.ReadLine()) != null) {    //这里读文本中的每一行;当执行到文件结尾后,line指向的将一直是内存中的没有内容的String对象,即line不会指向null。  所以while循环会不停的执行。
   pw.println(line);
  }
  
  mr.close();
  pw.close();
}

回复 使用道具 举报
import java.io.*;
class MyReaderLine
{
private FileReader fr;
MyLineNumber(FileReader fr)// 这里是构造函数吧,MyReaderLine(FileReader fr)
{
   this.fr=fr;
}
public String ReadLine()throws IOException
{
   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);
   }
   if(sb.length()!=0)  //为什么此处要用容器的长度方法呢?  不能这样判断?  if(sb.toString()!=null)  为什么不能这样呢?因为前面StringBuilder sb = new StringBuilder();sb创建分配了内存空间,所以sb.toString()!=null始终是ture,你的判断变得没有意义。
    return sb.toString();
  return null;
   
   
}
public void close()throws IOException
{
   fr.close();
}
}

StringBuilder sb = new StringBuilder();与StringBuilder sb=null是有区别的,
前者sb指向了堆内存的一个内存地址,就是分配了一个内存地址,只不过里面没有东西,已经实例化了。
而后者sb指向了null,即没有实例化
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马