使用ByteArrayOutputStream内存泄露

jiangsongjava 2011-06-12 02:13:30
今天在对文件进行操作的时候,发现读取20M以上的文件,JVM 就抛出Exception in thread "main" java.lang.OutOfMemoryError: Java heap space,内存溢出,请个老鸟们帮帮忙,如何可以让程序读取比较大的文件。
public class TestString3
{
static final int BUFFER = 2048;
/**
* 写入byte[]文件流数据
* */
public void witeFileData(byte [] data,String zipfilePath)
{
OutputStream out = null;
try
{
out = new FileOutputStream(zipfilePath);
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
try
{
out.write(data);
out.flush();
out.close();
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

public byte[] readFileData(String zipfilePath)
{
byte result [] = null;

try
{
ByteArrayOutputStream out = new ByteArrayOutputStream(1024);
InputStream stream = new FileInputStream(zipfilePath);
byte[] tmp = new byte[1024];
// tmp = new byte[stream.available()];
int bytesRead = stream.read(tmp);
while(bytesRead != -1)
{
out.write(tmp, 0, bytesRead);
bytesRead = stream.read(tmp);

}
result = out.toByteArray();
}
catch(Exception ex)
{
ex.printStackTrace();
}
return result;
}


public static void main(String[] args)
{
TestString3 string3 = new TestString3();
byte [] data = string3.readFileData("2222.rar");
string3.witeFileData(data, "E://PLSQL Developer 8.0 .rar");
}
}
...全文
1326 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
yangxiutian 2012-08-23
  • 打赏
  • 举报
回复
大文件用数组缓存确实够呛,数组理论上支持4GB的数据量 但受限于虚拟机。楼主的代码仔细看了下是没什么问题的,只有设置一下虚拟机的内存参数了 扩大heap的容量。
jiangsongjava 2011-06-13
  • 打赏
  • 举报
回复
这是一个WebService 例子,不能一边读一边写,必须一次性读完文件,返回给客户端一个byte【】数组
  • 打赏
  • 举报
回复
一边读一边写,不要全部读入内存再写进去。

50,528

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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