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ヒープスペースと理由がわかりませんか?唯一の違いは、最初のケースでは、2番目のケースとは異なる関数を使用することです。

4

3 に答える 3

4

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

各ループで新しい InputStream を作成しているため、各ループで最初のバイトのみを読み取っています。

while の前に入力ストリームを作成し、最初の例で行った方法で使用してみてください。

于 2012-07-11T15:51:01.613 に答える
1

最初の例では 1 つの InputStream を使用し、2 番目の例では無限に使用し、毎回最初の 1000 バイトを読み取っています。好きなように変更した場合;

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

期待どおりに実行されるはずです。

于 2012-07-11T15:54:31.273 に答える
1

その理由は次のとおりです。

2 つの方法を使用している場合、ByteArrayOutputStreamは範囲外になり、ガベージ コレクター (GC) によってクリーンアップできます。

1 つの方法のみを使用すると、バッファーを無効にしない限り、スコープ内にあるため、バッファーを 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 に答える