2017-03-31 51 views
1

我遇到了一種情況,在嘗試將輸入流轉換爲字節數組時出現內存異常。在較新的Android手機上,這沒有問題,但其中一些便宜的型號正在經歷它。這是我正在使用的方法。有沒有更有效的方法來做到這一點?Android將流轉換爲字節數組內存不足異常

public byte[] convertStreamToByteArray(InputStream is) throws IOException { 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    byte[] buff = new byte[1024]; 
    int i = 0; 
    while ((i = is.read(buff, 0, buff.length)) > 0) { 
    baos.write(buff, 0, i); 
    } 
    return baos.toByteArray(); 
} 
+0

1)你真的需要將所有這些字節讀入內存嗎? 2)你可以確定輸入流的大小而不用全部讀入嗎? – JimmyB

+1

請注意,'return baos.toByteArray();'將需要數據在內存中保存*兩次*,一次在baos中,一次在複製到底層數組的副本中。 – JimmyB

+1

它會在此代碼的第一次使用或一段時間後出現。認爲這是一個流和密切。 closebale通常需要關閉,否則會發生資源泄漏。 –

回答

1

有是,不要將所有數據從流中複製到內存中。

爲什麼你需要這樣做?

您不能讀取並使用流數據,而是將整個數據保存在內存中嗎?

如果您需要一些緩衝區,儘可能小的緩衝區可以進行消耗/處理,並將緩衝區丟棄並創建一個新緩衝區,以便儘可能少地使用內存。

1

看看IOUtils是否能幫助你。

導入它

import org.apache.commons.io.IOUtils; 

然後嘗試:

public byte[] convertStreamToByteArray(InputStream is) throws IOException { 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    IOUtils.copy(is, baos); 
    return baos.toByteArray(); 
} 
+0

我只是試過這段代碼,我仍然有同樣的問題 – Jeremy

0

嘗試使用的InputStream大小像這樣創建一個字節數組:

public byte[] convertStreamToByteArray(InputStream is) throws IOException { 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    byte[] buff = new byte[is.available()]; 
    int i = 0; 
    while ((i = is.read(buff, 0, buff.length)) > 0) { 
     baos.write(buff, 0, i); 
    } 
    return baos.toByteArray(); 

}