内存溢出问题!

阿诺 2013-03-15 04:06:37
一个读取文件的方法:
Android:
public String readFile(String fileName) throws Exception{
ByteArrayOutputStream outStream=new ByteArrayOutputStream();
FileInputStream fis=context.openFileInput(fileName);
byte [] buffer=new byte[1024];
int length=fis.read(buffer);//1
while(length != -1){//2
outStream.write(buffer,0,lengt)
}
byte[] b= outStream.toByteArray();
String s=new String(b);
return s;
}
如上所示了:注释1和2处
这样写为什么会出现java.lang.OutOfMemoryError
是内存溢出吧!
我修改1,2处:如下:3,4
public String readFile(String fileName) throws Exception{
ByteArrayOutputStream outStream=new ByteArrayOutputStream();
FileInputStream fis=context.openFileInput(fileName);
byte [] buffer=new byte[1024];
int length=0;//3
while((length = fis.read(buffer)) != -1){//4
outStream.write(buffer,0,lengt)
}
byte[] b= outStream.toByteArray();
String s=new String(b);
return s;
}
这样就没有问题了。真心求解释!

...全文
238 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
dracularking 2013-04-02
  • 打赏
  • 举报
回复
引用 6 楼 anybyb 的回复:
引用 4 楼 dracularking 的回复:1是只读了一次,一直write就可能内存溢出 读一次是不是表示一次性把数据全读了,然后再来写入内存中,,,数据太多,就内存溢出?可以这样理解么?
差不多,不过未必是全部读取,是至多1024个字节,读一次只是从文件输入流中读取了至多1024个字节并存入byte数组中 写入会溢出是因为写入动作在while的控制下重复将同一个byte数组数据写入输出流 看下解释: public void write(byte[] b, int off, int len) throws IOException Writes len bytes from the specified byte array starting at offset off to this output stream.
小V小V志 2013-04-02
  • 打赏
  • 举报
回复
int length=fis.read(buffer);//1 while(length != -1){//2 outStream.write(buffer,0,lengt) } 这样理解:读了一次,length>-1, while无限执行!不断写io
阿诺 2013-04-02
  • 打赏
  • 举报
回复
引用 4 楼 dracularking 的回复:
1是只读了一次,一直write就可能内存溢出
读一次是不是表示一次性把数据全读了,然后再来写入内存中,,,数据太多,就内存溢出?可以这样理解么?
dracularking 2013-03-20
  • 打赏
  • 举报
回复
1是只读了一次,一直write就可能内存溢出
阿诺 2013-03-20
  • 打赏
  • 举报
回复
引用 1 楼 fangmingshijie 的回复:
int length=fis.read(buffer);//1这在一直读
length = fis.read(buffer)) != -1){//4 4这里不是也一直在读吗?4和1的差别在哪里呢?谢谢!
长笛党希望 2013-03-20
  • 打赏
  • 举报
回复
改成这样: byte [] buffer=new byte[1024]; int length=0;//1 while((length=fis.read(buffer)) != -1){//2 outStream.write(buffer,0,lengt) } 楼主写的代码中,1处虽然执行了一次,但依据楼主的情况该length恒不等于-1,导致2处无限循环,导致不停write,然后溢出。
  • 打赏
  • 举报
回复
while((fis.read(buffer)) != -1){//4 outStream.write(buffer,0,lengt) } 试试
  • 打赏
  • 举报
回复
int length=fis.read(buffer);//1这在一直读

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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