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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 早知道 中级黑马   /  2013-9-15 15:02  /  1373 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 早知道 于 2013-9-20 20:14 编辑

代码如下:
public class MyBufferedReader {
public FileReader reader = null;
public MyBufferedReader(FileReader reader){
  this.reader = reader;
}
public String myReadLine() throws IOException{//定义要功能抛出异常
  StringBuilder sb = new StringBuilder();
  char b = 0;
  while((b= (char) reader.read())!=-1){
   if(b=='\r')
    continue;
   if(b=='\n')
    return sb.toString();
   else{
   sb.append((char)b);//栈溢出
   }
   
  }

  if(sb.length()!=0)
   return sb.toString();
  return null;
  
}
public void Myclose() throws IOException {
  reader.close();
  
}


}
class MyBufferedTest{
public static void main(String[] args){
  MyBufferedReader buf = null;
  try {
   buf = new MyBufferedReader(new FileReader("buf.txt"));
   String len = null;
   while((len=buf.myReadLine())!=null){
    System.out.println(len);
   }
  } catch (FileNotFoundException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }finally{
   try {
    if(buf!=null)
    buf.Myclose();
   } catch (IOException e) {
    // TODO Auto-generated catch block
    throw new RuntimeException("读取关闭失败");
   }
  }
}
}

报错:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:2882)
at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:100)
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:572)
at java.lang.StringBuilder.append(StringBuilder.java:203)
at cn.itcast.io.MyBufferedReader.myReadLine(MyBufferedReader.java:22)
at cn.itcast.io.MyBufferedTest.main(MyBufferedReader.java:45)


评分

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

查看全部评分

4 个回复

倒序浏览
char b = 0;
你把b的类型定义成char类型,
然后 while((b= (char) reader.read())!=-1){
你把reader.read()返回值强转化成char 再与-1进行比较,这肯定不会相等嘛。
while死循环,sb.append((char)b一直在执行,所以会出现OutOfMemoryError
回复 使用道具 举报
本帖最后由 Yuan先生 于 2013-9-15 15:37 编辑

刚回错了,再研究一下
回复 使用道具 举报
  1. import java.io.FileNotFoundException;
  2. import java.io.FileReader;
  3. import java.io.IOException;

  4. class MyBufferedReader1 {
  5. public FileReader reader = null;
  6. public MyBufferedReader1(FileReader reader){
  7.   this.reader = reader;
  8. }
  9. public String myReadLine() throws IOException{//定义要功能抛出异常
  10.   StringBuilder sb = new StringBuilder();
  11.   
  12.    int b = 0;
  13.   while((b=reader.read())!=-1){
  14.    if(b=='\r')
  15.     continue;
  16.    if(b=='\n')
  17.     return sb.toString();
  18.    else{
  19.    sb.append((char)b);//栈溢出
  20.    }
  21.    
  22.   }

  23.   if(sb.length()!=0)
  24.    return sb.toString();
  25.   return null;
  26.   
  27. }
  28. public void Myclose() throws IOException {
  29.   reader.close();
  30.   
  31. }


  32. }
  33. public class aa{
  34. public static void main(String[] args){
  35.   MyBufferedReader1 buf = null;
  36.   try {
  37.    buf = new MyBufferedReader1(new FileReader("F:\\zz.txt"));
  38.    String len = null;
  39.    while((len=buf.myReadLine())!=null){
  40.     System.out.println(len);
  41.    }
  42.   } catch (FileNotFoundException e) {
  43.    // TODO Auto-generated catch block
  44.    e.printStackTrace();
  45.   } catch (IOException e) {
  46.    // TODO Auto-generated catch block
  47.    e.printStackTrace();
  48.   }finally{
  49.    try {
  50.     if(buf!=null)
  51.     buf.Myclose();
  52.    } catch (IOException e) {
  53.     // TODO Auto-generated catch block
  54.     throw new RuntimeException("读取关闭失败");
  55.    }
  56.   }
  57. }
  58. }
复制代码
reader.read()返回的是一个int型数据,然后再与-1进行比较;我把你的b类型改成int;MyBufferedReader 前面的public去掉,MyBufferedTest前面加上public就没有问题了

评分

参与人数 1技术分 +1 收起 理由
杨增坤 + 1

查看全部评分

回复 使用道具 举报
顶!{:soso_e100:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马