要读取一个近500M的文件,请问大家有何高招,
我用BufferedInputStream还是出现了OutOfMemoryError的错误。
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space我按照这个文章中说的方法也是无法读取500m的large文件,
http://techrepublic.com.com/5208-10878-0.html?forumID=10&threadID=108599&messageID=650720
public byte[] read2list(String file) throws Exception {
InputStream in = null;
byte[] buf = null; // output buffer
int bufLen = 20000*1024;
try{
in = new BufferedInputStream(new FileInputStream(file));
buf = new byte[bufLen];
byte[] tmp = null;
int len = 0;
List data = new ArrayList(24); // keeps peaces of data
while((len = in.read(buf,0,bufLen)) != -1){
tmp = new byte[len];
System.arraycopy(buf,0,tmp,0,len); // still need to do copy
data.add(tmp);
}
/*
This part os optional. This method could return a List data
for further processing, etc.
*/
len = 0;
if (data.size() == 1) return (byte[]) data.get(0);
for (int i=0;i<data.size();i++) len += ((byte[]) data.get(i)).length;
buf = new byte[len]; // final output buffer
len = 0;
for (int i=0;i<data.size();i++){ // fill with data
tmp = (byte[]) data.get(i);
System.arraycopy(tmp,0,buf,len,tmp.length);
len += tmp.length;
}
}finally{
if (in != null) try{ in.close();}catch (Exception e){}
}
return buf;
}
我用BufferedInputStream还是出现了OutOfMemoryError的错误。
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space我按照这个文章中说的方法也是无法读取500m的large文件,
http://techrepublic.com.com/5208-10878-0.html?forumID=10&threadID=108599&messageID=650720
public byte[] read2list(String file) throws Exception {
InputStream in = null;
byte[] buf = null; // output buffer
int bufLen = 20000*1024;
try{
in = new BufferedInputStream(new FileInputStream(file));
buf = new byte[bufLen];
byte[] tmp = null;
int len = 0;
List data = new ArrayList(24); // keeps peaces of data
while((len = in.read(buf,0,bufLen)) != -1){
tmp = new byte[len];
System.arraycopy(buf,0,tmp,0,len); // still need to do copy
data.add(tmp);
}
/*
This part os optional. This method could return a List data
for further processing, etc.
*/
len = 0;
if (data.size() == 1) return (byte[]) data.get(0);
for (int i=0;i<data.size();i++) len += ((byte[]) data.get(i)).length;
buf = new byte[len]; // final output buffer
len = 0;
for (int i=0;i<data.size();i++){ // fill with data
tmp = (byte[]) data.get(i);
System.arraycopy(tmp,0,buf,len,tmp.length);
len += tmp.length;
}
}finally{
if (in != null) try{ in.close();}catch (Exception e){}
}
return buf;
}
解决方案 »
- 乱码出来了
- 关于java图像处理的问题
- 请问数字转字符串的问题 如 32 转为 '0032'
- windows中双击jar文件即可运行的执行方式怎么写?
- Java 2核心技术哪版比较好?
- 问个端口通信的问题,如何向子网内的机器发送消息?????200分,急啊
- 看Thinking in Patterns with Java,对其中的一句英文不太理解,请看过的人进来给我解释一下
- 关于Applet, 一个十分让人不理解的问题!!!?
- 高分求教,关于JTextField
- 我想学习手机和PDA、Pocket PC方面Java的开发。
- 用正则表达式,从SQL中,取得项目明字,和表名
- ResultSet 有没有选择数据行的限制??
设置一下stack size的大小 java 后跟参数即可设置,具体参数如下:
-Xms size set initial Java heap size
-Xmx size set maximum Java heap size
-Xss size set java thread stack size
测了下,发现我装的Eclipse,默认只有64M。用楼主的这个类,读取60M的文件,居然消耗180M...class Test {
public static void main(String[] args) {
System.out.println("JVM MAX MEMORY:"+Runtime.getRuntime().maxMemory()/1024/1024+"M");
System.out.println("JVM USED MEMORY:"+Runtime.getRuntime().totalMemory()/1024/1024+"M");
}
}