2017-03-31 54 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(); 

}