读450M的文件,报内存溢出?

sAS112UUUYY111 2009-12-25 02:56:43
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;

public class d {
public static void main(String[] args) throws IOException {
d d1=new d();
d1.read();
}

public void read() throws IOException{
File f = new File("d:\\a.xml");\\a是450m大小
FileInputStream fis = new FileInputStream(f);
byte[] b = new byte[(int)f.length()];
fis.read(b);
}
}


报错:
java.lang.OutOfMemoryError: Java heap space


我的内存是2G的


...全文
473 44 打赏 收藏 转发到动态 举报
写回复
用AI写文章
44 条回复
切换为时间正序
请发表友善的回复…
发表回复
whut_lcy 2009-12-30
  • 打赏
  • 举报
回复
当然,目前还没有用过基于java的、吃内存很大的程序。但感觉在这种应用下,非得调整jvm内存大小才可以解决了。谁叫java程序只能用jvm才可以跑呢,而不是c,c++那样编完了就完了。

所以,觉得java在桌面程序没有优势,界面不好看是其次,效率问题是关键。
whut_lcy 2009-12-30
  • 打赏
  • 举报
回复
但有时候确实有需求把文件一次性全部读入内存,比如玩大的游戏魔兽世界,NFS12,13代等等。这又怎么搞?就算不是游戏,比如eclipse,跑起来都400, 500M内存的涨。怎么搞

这个时候不存在把文件buffer起来再写出去吧?全部占着内存呢
zhang2chenggong 2009-12-30
  • 打赏
  • 举报
回复
帮顶
y11111494 2009-12-30
  • 打赏
  • 举报
回复
mulucu 2009-12-28
  • 打赏
  • 举报
回复
分布读取
铁匠梁老师 2009-12-28
  • 打赏
  • 举报
回复
楼主的代码是一次性把文件映射到内存,java默认的最大内存只有64M
所以需要重新指定jvm的内存参数。

建议使用缓存机制处理。
junyun414 2009-12-28
  • 打赏
  • 举报
回复
硬是我才开始学的时候都是读一些写一些,还真没想过一次就把一个文件读入内存,看了楼主的贴子,我才感觉到自己真是无知,看来的多看多想才是王道啊。
长富 2009-12-28
  • 打赏
  • 举报
回复
学习了
angel6709 2009-12-28
  • 打赏
  • 举报
回复
[(int)f.length()];
f.length()=450*1024*1024*8
2[size=8px]23[/size]*2[size=8px]8[/size]+450-256
=2[size=8px]31[/size]+194

不在2[size=8px]-31[/size]——————————2[size=8px]31[/size]之间
聪头 2009-12-28
  • 打赏
  • 举报
回复
分段读取。
magicelfzz 2009-12-28
  • 打赏
  • 举报
回复
受益匪浅 ,学习!!!!!!
forever_ai 2009-12-27
  • 打赏
  • 举报
回复
路过
jf
hsf_1982 2009-12-27
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 sas112uuuyy111 的回复:]
谢谢各位的建议,受益匪浅
java -Xms32m -Xmx800m className
可以读入450M文件。共同学习。
[/Quote]
给楼主一个建议,靠这种方法,永远不是解决这类问题的方法。建议你从需求开始优化你的程序,否则只能让自己停留在编写小Java程序的层次。
Nothingstop 2009-12-27
  • 打赏
  • 举报
回复
你可以用定位信息的方式来文件,一下子加载450M内存消耗太大了
辛鹤 2009-12-26
  • 打赏
  • 举报
回复
受益匪浅
wangwffgqeg 2009-12-26
  • 打赏
  • 举报
回复
Mark
pjw100 2009-12-26
  • 打赏
  • 举报
回复
没有那么多假如,限制文件大小为1G
gbb21 2009-12-26
  • 打赏
  • 举报
回复
假如有个10G的文件怎么办?
crazylaa 2009-12-26
  • 打赏
  • 举报
回复
楼主你真猛,哪有你这么读文件的!
如果有个2G的文件,你咋办?
SambaGao 2009-12-26
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 nickycheng 的回复:]
哪有这种读法
Java codepublicvoid read()throws IOException{
File f=new File("d:\\a.xml");
FileInputStream fis=new FileInputStream(f);
OutputStream os=new FileOutputStream("d:\\b.xml.copy");byte[] buff=newbyte[1024];int len;while ((len= fis.read(buff))!=-1) {
os.write(buff,0, len);
};
os.close(); fis.close();
}
[/Quote]

可以解决。
加载更多回复(24)

62,614

社区成员

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

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