1

我遇到了一个我不明白的内存问题。我有以下情况

情况1

public  byte[] getBytes(InputStream is) throws IOException {

            int len;
            int size = 1024;
            byte[] buf;

              ByteArrayOutputStream bos = new ByteArrayOutputStream();
              buf = new byte[size];
              while ((len = is.read(buf, 0, size)) != -1)
              {
                bos.write(buf, 0, len);
              }
              buf = bos.toByteArray();

            return buf;
          }

Public void dosomething()
{
 //instructions
InputStream is = new ByteArrayInputStream(getBytes(bodyPart.getInputStream()));

}

工作正常没有错误

但是这个

案例2

Public void dosomething()
{
 //instructions
ByteArrayOutputStream bos = new ByteArrayOutputStream();
                    int len;
                    int size = 1024;
                    byte[] bufferFichierEntree = new byte[size];
                     while ((len = bodyPart.getInputStream().read(bufferFichierEntree, 0, size)) != -1)
                     {
                         bos.write(bufferFichierEntree, 0, len);
                     }
InputStream is = new ByteArrayInputStream(bufferFichierEntree);

}

返回一个 java.lang.OutOfMemoryError: Java heap space 和一个不知道为什么?唯一的区别是,在第一种情况下,我使用的功能与第二种情况不同

4

3 回答 3

4

while ((len=bodyPart.getInputStream().read(bufferFichierEntree, 0, size)) != -1) 

您正在每个循环中创建新的 InputStream,因此您只读取每个循环中的第一个字节。

尝试在 while 之前创建输入流,并按照您在第一个示例中的方式使用它。

于 2012-07-11T15:51:01.613 回答
1

似乎是 getInputStream 的范围问题,在第一个示例中,您使用 1 个 InputStream,在第二个示例中使用无穷大,并且每次都读取前 1000 个字节。如果您将其更改为喜欢;

InputStream is = bodyPart.getInputStream(); 
while ((len = is.read(bufferFichierEntree, 0, size)) != -1) {

它应该按预期运行。

于 2012-07-11T15:54:31.273 回答
1

其原因可能是:

当您使用两种方法时,它们ByteArrayOutputStream会超出范围,并且可以由垃圾收集器 (GC) 清理。

仅使用一种方法,您的缓冲区无法被 GC 清理,因为它仍在范围内,除非您将其取消。

当然,另一个原因可能是您每次都在循环中创建一个新的 InputStream,因为我们不知道具体是做什么bodyPart.getInputStream()的。如果是这种情况,请像这样解决它:

InputStream in = bodyPart.getInputStream();
while ((len = in.read(bufferFichierEntree, 0, size)) != -1)
{
    bos.write(bufferFichierEntree, 0, len);
}
于 2012-07-11T15:51:09.007 回答