读文件,报java.lang.OutOfMemoryError

justinavril 2008-08-06 02:56:17
大家看下这个代码:
import java.io.*;

public class FileToString {
public static String readFile(String fileName) {
String output = "";

File file = new File(fileName);

if(file.exists()){
if(file.isFile()){
try{
BufferedReader input = new BufferedReader (new FileReader(file));
StringBuffer buffer = new StringBuffer();
String text; //问题出在这2行,如果我这么写的话,就会报那个错误。
//String text = input.readLine();
while((text = input.readLine()) != null) //while(text != null)
buffer.append(text +"\n");

output = buffer.toString();
}
catch(IOException ioException){
System.err.println("File Error!");

}
}
else if(file.isDirectory()){
String[] dir = file.list();
output += "Directory contents:\n";

for(int i=0; i<dir.length; i++){
output += dir[i] +"\n";
}
}
}
else{
System.err.println("Does not exist!");
}
return output;
}

public static void main (String args[]){
String str = readFile("C:/1.txt");

System.out.print(str);
}
}

奥运加油!

北京加油!

中国加油!

我当时觉得按注释那样写,也没什么错误啊,结果运行就出错了 报java.lang.OutOfMemoryError的错误
...全文
190 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuechenyoyo 2008-10-15
  • 打赏
  • 举报
回复
BufferedReader input = new BufferedReader (new FileReader(file));
StringBuffer buffer = new StringBuffer();
顾名思义,用缓存的方式来处理数据,如果数据较大肯定会OutOfMemoryError.
不要缓存,读一句写一句就不会OutOfMemoryError.
yeeshengwei 2008-08-06
  • 打赏
  • 举报
回复
原因: 死循环,迟早是耗尽buffer的已分配内存
给一个测试:
                    //test
String text = input.readLine();
int counter = 1;
long startTime = System.nanoTime();
while(text != null){
buffer.append(text + "\n");
long endTime = System.nanoTime();
System.out.println(counter + ": " + (endTime - startTime) + "ns");
counter++;
}

运行结果:

132917: 4396824736ns
132918: 4396842336ns
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Unknown Source)
at java.lang.AbstractStringBuilder.expandCapacity(Unknown Source)
at java.lang.AbstractStringBuilder.append(Unknown Source)
at java.lang.StringBuffer.append(Unknown Source)
qq82819313 2008-08-06
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 justinavril 的回复:]
那其实要是按注释那么写 在while循环里 再加上text = input.readLine();就可以了
[/Quote]

不能这么改,这么改就错了,这样相当于第一行没有取到!
如果实在要改的话:

while((text!= null) {
buffer.append(text +"\n");
text = input.readLine();
}
KOOK_OKKO 2008-08-06
  • 打赏
  • 举报
回复
String text = input.readLine();
while((text = input.readLine()) != null)
这样写的话只要input流里一直有一行数据
所以就不为null,所以不停的循环
  • 打赏
  • 举报
回复
1.
String text = input.readLine();
while(text!= null) {
buffer.append(text +"\n");
text = input.readLine();
}
---------------------
2.或者合成一句。。。
while ((text=input.readLine()) != null)
--------------------
如果按照注释那样写,readLine只执行了一次,所以text永远也不为null,所以死--循-环-
dsn21 2008-08-06
  • 打赏
  • 举报
回复
死循环。。。。。。。。啊 帮顶
imasmallbird 2008-08-06
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 justinavril 的回复:]
那其实要是按注释那么写 在while循环里 再加上text = input.readLine();就可以了
[/Quote]

对头~~
zidasine 2008-08-06
  • 打赏
  • 举报
回复
//String text = input.readLine();
如果这个text不为null
那么//while(text != null)

就相当于while(true)
所死循环

while((text = input.readLine()) != null)
是每循环一次读取一行新的数据赋给text
所以每次text都是新的值
当读到最后的时候text==null
结束循环
justinavril 2008-08-06
  • 打赏
  • 举报
回复
那其实要是按注释那么写 在while循环里 再加上text = input.readLine();就可以了
justinavril 2008-08-06
  • 打赏
  • 举报
回复
哦 对 我明白了 嗯 没转过弯来
[Quote=引用 5 楼 cydp007 的回复:]
Java codewhile((text = input.readLine()) != null)



你这样写是正确的的原因是 。 只有这样才能读完整个文件。

text不停的有新值.


Java codeString text = input.readLine();
while(text != null)




这样写只是把你的文件第一行不停的读入而已. 所以会报 out错误.
[/Quote]
cydp007 2008-08-06
  • 打赏
  • 举报
回复
while((text = input.readLine()) != null)


你这样写是正确的的原因是 。 只有这样才能读完整个文件。

text不停的有新值.

String text = input.readLine();
while(text != null)


这样写只是把你的文件第一行不停的读入而已. 所以会报 out错误.

cydp007 2008-08-06
  • 打赏
  • 举报
回复
while((text = input.readLine()) != null)


你这样写是正确的的原因是 。 只有这样才能读完整个文件。

text不停的有新值.

String text = input.readLine();
while(text != null)


这样写只是把你的文件第一行不停的读入而已. 所以会报 out错误.

xuhaiyang 2008-08-06
  • 打赏
  • 举报
回复
因为你text从input里读了一行后就永远不变了,当然是死循环 。
也就是text说不可能变为null
justinavril 2008-08-06
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 xuhaiyang 的回复:]
注释那么写就死循环,当然报java.lang.OutOfMemoryError的错误
[/Quote]
为什么是死循环啊...我没看出来啊...
xuhaiyang 2008-08-06
  • 打赏
  • 举报
回复
注释那么写就死循环,当然报java.lang.OutOfMemoryError的错误
justinavril 2008-08-06
  • 打赏
  • 举报
回复
我觉得按照注释那么写 和 正常运行的代码 没有什么逻辑区别啊...
最多的不同就是读到最后一行 大不了text为空嘛...

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧