输入流内存错误的问题

时间:2013-08-07 21:40:01

标签: android spring bitmap bytearray inputstream

我正在使用Android的SpringFramework来获取我的输入流。

    @Override
    public InputStream getImageStream(String url) {

    InputStream is = new ByteArrayInputStream(template.getForObject(url, byte[].class));

    return is;

}

对于前几个输入流,它可以正常运行。没有问题,但是,我认为它试图获得一个非常大的输入流。所以我得到了outofmemory错误。

我看到很多帖子使用类似下面的代码:

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);
      }

      byte[] byteArray= byteBuffer.toByteArray();

      return byteArray;
}

这段代码的想法是以块的形式读取输入流吗?

但是我得到的outofmemory错误是在我甚至可以启动readBytes方法之前。我试着把重置放到各处...我想也许我应该在读取或读取之后清除内存。但我不知道如何,我不知道这是不是正确的方法?

我认为我的基础错误了吗?我是android和java的新手......有没有办法让InputStream采用另一种方式?我还读了一些关于BufferedInputStream的内容,但我想不出一种适合它的方法。

我的目标是在数据库中存储图像的blob。我的输入是通过oauth的imgurl。

我还可以通过另一个网址调用较低质量版本的输入流。一切正常...... 但是我想用原始图片网址尝试一下,因为之后我想要能够下载一张用于打印照片的原件。

1 个答案:

答案 0 :(得分:0)

由于在使用ByteArrayInputStream时读取内存中的整个数据,因此出现OutOfMemory错误。另请注意,当您在ByteArrayOutputStream中写入时,它也会将数据保存在内存中(它只是字节数组的简单包装)。可能你应该使用FileOutputStream代替缓存。