关于读入大型文件(内有繁体中文),内存java.lang.OutOfMemoryError的问题

马行空牛耕田 2003-01-15 04:07:21
文件大小 :15M左右
读入代码 :
BufferedInputStream bisB001 = new BufferedInputStream(new FileInputStream(afileB001));
byte[] byB001 = new byte[new Long(afileB001.length()).intValue()];
bisB001.read(byB001);
String strFile = new String(byB001,"Big5");

报错:
java.lang.OutOfMemoryError

<<no stack trace available>>

Exception in thread "main"

如何解决
...全文
53 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
马行空牛耕田 2003-01-16
  • 打赏
  • 举报
回复
圆满解决,结帖!
takecare 2003-01-15
  • 打赏
  • 举报
回复
试试这个行不行?我不知道你的解释器是不是针对每个节点解释的。如果不是的话,可能你要改写接口了。

BufferedReader bfReader = new BufferedReader(
new BufferedInputStream(
new BufferedInputStream(
new FileInputStream(afileB001)
)
)
);
static final String staticString = "<tblArticleBasic>";
String oneLine;
StringBuffer oneNode = new StringBuffer();
int flag = 0; //flag for new node begins
while ((oneLine = bfReader.readLine()) != null) {
oneLine = new String(oneLine.getBytes(),"Big5");
if (oneLine.indexOf(staticString) >= 0) {
if (flag == 0) {
//one node begins
flag = 1;
}

if (flag == 1) {
flag == 0;
//one node ready, call your node dispose methods here
......

//after dispose methods, please free all data
oneNode.delete(0, oneNode.length()); //delete all former data
}
}
oneNode.append(oneLine); //append this string to the node
}
takecare 2003-01-15
  • 打赏
  • 举报
回复
我想到这里,你可以跟我一起写,呵呵。
BufferedReader bfReader = new BufferedReader(
new BufferedInputStream(
new BufferedInputStream(
new FileInputStream(afileB001)
)
)
);
static final String staticString = "<tblArticleBasic>";
String oneLine;
StringBuffer oneNode = new StringBuffer();
while ((oneLine = bfReader.readLine()) != null) {
oneLine = new String(oneLine.getBytes(),"Big5");
if (oneLine.indexOf(staticString) != -1) {
oneNode.append(oneLine);
} else {

}
}
马行空牛耕田 2003-01-15
  • 打赏
  • 举报
回复
to takecare(大厅)
对,我也就是这个思路,读记录时还要注意判断文件是否结束!
但是还要注意的是记录的繁体中文不能被破坏掉,原来用RandomAccessFile一行行读的话,不仅慢,而且会把繁体中文给破坏!

多谢
takecare 2003-01-15
  • 打赏
  • 举报
回复
基本思想是:
读到<tblArticleBasic>后,就不停的请求新的数据,直到读到下一个<tblArticleBasic>。
而且使用BufferedReader 而不是 BufferedInputStream。

过会儿我再给你写个模板程序吧。
eyeieye 2003-01-15
  • 打赏
  • 举报
回复
文件有固定格式的吧,写个filter处理处理
takecare 2003-01-15
  • 打赏
  • 举报
回复
我觉得有必要修改你的解释器。让我想想先。
马行空牛耕田 2003-01-15
  • 打赏
  • 举报
回复
to Patrick_DK:
不是内存泄漏,是内存不够,呵呵,我的代码消耗内存太多了

当时测试的时候用的是小数据,现在太多数据就不行了
Patrick_DK 2003-01-15
  • 打赏
  • 举报
回复
http://expert.csdn.net/Expert/TopicView1.asp?id=1270666
马行空牛耕田 2003-01-15
  • 打赏
  • 举报
回复
to takecare(大厅)

因为每条记录长度不等,所以我没办法得到off,len,它们都是不固定的,特别是len

记录文件内容如下:
<tblArticleBasic>
|A01.4003|BOOK|Book|A1|坝叭びキの钞|00|獶絪胯籹|EA|each|CM|Centimeter|0|0|0|G|Gram|0|0||0|
<tblArticleDesc>
|A01.4003|EN|璣粂|常カ痜產畑崩猭竑粂魁紇盿舶|常カ痜產畑崩猭竑粂魁紇盿舶|
|A01.4003|ZF|いゅ(羉)|常カ痜產畑崩猭竑粂魁紇盿舶|常カ痜產畑崩猭竑粂魁紇盿舶|
<tblArticleBarCode>
|A01.4003|2200001370005|1|
|A01.4003|2100000008049|0|
<tblArticleMerhCat>
|A01.4003|A150514|竒マ||||||1|
<tblArticleBook>
|A01.4003|A01.4003|||||01000101 000000|0|||0|0|||||0|||
<tblBookAuthor>
|A01.4003|A104010|纒糷洛ネボ絛|
<tblBookPublisher>
|A01.4003|P005908|坝叭繻(翠)Τそ|
<tblArticlePrice>
|A01.4003|HKD|Hong Kong Dollar|260|

<tblArticleBasic>
|2100000009305|BOOK|Book|E||00|獶絪胯籹|EA|each|CM|Centimeter|130|187|0|G|Gram|245|245||0|
<tblArticleDesc>
|2100000009305|EN|璣粂|ネ㏑灸秈-厩拜產獵ぶ|ネ㏑灸秈-厩拜產獵ぶ|
|2100000009305|ZF|いゅ(羉)|ネ㏑灸秈-厩拜產獵ぶ|ネ㏑灸秈-厩拜產獵ぶ|
<tblArticleBarCode>
|2100000009305|2100000009305|1|
<tblArticleMerhCat>
|2100000009305|A050899|ゅての厩砃肚癘||||||1|
<tblArticleBook>
|2100000009305||丁翺(81)|ZF|いゅ(羉)||19980225 000000|2|07|32秨|255|7|05|キ|||0|||
<tblBookEditor>
|2100000009305|E017368|糂|
|2100000009305|E005323|蚿|
<tblBookPublisher>
|2100000009305|P005671|厨ゅて穨Τそ|
<tblArticlePrice>
|2100000009305|HKD|Hong Kong Dollar|40|

<tblArticleBasic>
|2100000009558|BOOK|Book|D|翠|00|獶絪胯籹|EA|each|CM|Centimeter|135|208|0|G|Gram|175|175||0|
<tblArticleDesc>
|2100000009558|EN|璣粂|洛励描|洛励描|
|2100000009558|ZF|いゅ(羉)|洛励描|洛励描|
<tblArticleBarCode>
|2100000009558|2100000009558|1|
<tblArticleMerhCat>
|2100000009558|A150605|羬洛厩||||||1|
<tblArticleBook>
|2100000009558||匡拒翺|ZF|いゅ(羉)||01000101 000000|1|08|32秨|142|1|05|キ|||0|||
<tblBookPublisher>
|2100000009558|P005709|禣〆穦|
<tblArticlePrice>
|2100000009558|HKD|Hong Kong Dollar|38|

<tblArticleBasic>
|2100000010387|BOOK|Book|D|翠|00|獶絪胯籹|EA|each|CM|Centimeter|129|187|0|G|Gram|440|440||0|
<tblArticleDesc>
|2100000010387|EN|璣粂|碊碊|碊碊|
|2100000010387|ZF|いゅ(羉)|碊碊|碊碊|
<tblArticleBarCode>
|2100000010387|2100000010387|1|
<tblArticleMerhCat>
|2100000010387|A030306|い瓣砰ゅ厩||||||1|
<tblArticleBook>
|2100000010387||瞊‵场Ρぇ|ZF|いゅ(羉)||19941001 000000|3|07|32秨|484|1|05|キ|||0|||
<tblBookAuthor>
|2100000010387|A078412|畗硉|
<tblBookPublisher>
|2100000010387|P006738|讽ゅ美|
<tblArticlePrice>
|2100000010387|HKD|Hong Kong Dollar|50|
takecare 2003-01-15
  • 打赏
  • 举报
回复
while (read(byte[] b, int off, int len) != -1) {

//read, read, read

}
马行空牛耕田 2003-01-15
  • 打赏
  • 举报
回复
怎么释放?
其实我把文件的全部内容读到内存中是不适当的,但是这个文件中存放的是许多记录,每10几行不等 构成一条记录!我要解析每一条记录!
takecare 2003-01-15
  • 打赏
  • 举报
回复
>byte[] byB001 = new byte[new Long(afileB001.length()).intValue()];
可怕!


同意bdsc!
bdsc 2003-01-15
  • 打赏
  • 举报
回复
在于你要干什么,读一些,处理一些,释放,读下一部分,处理,释放。。。

62,616

社区成员

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

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