2011-12-07 28 views
1

私のアプリでは、FileInputStreamクラスにビデオファイルのパスを与えてから、 をバイト配列に変換する必要がありますが、メモリが不足している例外をスローする方法を教えてください。 コードを投稿してくださいここで事前に感謝します。メモリ不足例外

public byte[] readBytes(InputStream inputStream) throws IOException 
{  
    ByteArrayOutputStream byteBuffer = new ByteArrayOutputStream(); 
    int bufferSize = 1024;  
    byte[] buffer = new byte[bufferSize];  
    int len = 0;  
    while ((len = inputStream.read(buffer)) != -1) 
    {   
     byteBuffer.write(buffer, 0, len); 
    }  
    return byteBuffer.toByteArray(); 
} 
+1

あなたのエラーログとコードを過ぎてください。 –

+1

ビデオファイルのサイズはどれくらいですか? – Caner

+0

代わりにビデオファイル全体をダウンロードしてください。ライブストリーミングを使用しないでください! DownloadManagerがこのタイプのダウンロードを処理しているかどうかわからないので、あなたはそれを試すことができます。 – vikky

答えて

0

ビデオファイルが大きすぎてメモリに収まりません。ファイル全体をメモリに置く必要があることを100%保証していますか?これは通常、悪い設計概念です。

4

テストしているデバイスでは、約20MBのヒープを使用できます。それが失敗すると、あなたのアプリは既に13.5MBのメモリを使用しています。 ByteArrayOutputStreambyte arrayに変換しようとすると、十分なメモリがないために新しい〜7MBのサイズbyte[]を割り当てようとしています。 1つの回避策は、内部のbyte[]ByteArrayOutputStreamに再利用してこの新しい割り当てを回避することです。残念ながら、そこに外部からそれにアクセスする方法はありませんので、あなたはこのように、独自の道を作成する必要があります。

まずMyByteArrayOutputStream.java作成:

public MyByteArrayOutputStream extends ByteArrayOutputStream { 
    @Override 
    public synchronized byte[] toByteArray() { 
     return buf; 
    } 
} 

をそして、あなたのコード内で:

public byte[] readBytes(InputStream inputStream) throws IOException 
{  
    MyByteArrayOutputStream byteBuffer = new MyByteArrayOutputStream(); // note the change! 
    int bufferSize = 1024;  
    byte[] buffer = new byte[bufferSize];  
    int len = 0;  
    while ((len = inputStream.read(buffer)) != -1) 
    {   
     byteBuffer.write(buffer, 0, len); 
    } 
    inputStream.close(); // hopefully this will release some more memory 
    return byteBuffer.toByteArray(); 
} 

大きなビデオではこれでも失敗します。最適には、大きなファイルを小さな塊でアップロードするようにしてください。

+0

その小さなビデオのためにあまりにもありがとうございますその作業 – raju

+1

http://meta.stackexchange.com/a/5235/172216 – Caner