使用输入流的Bufferedreader给出Out of Memory Error Android Java

时间:2014-11-26 12:10:45

标签: java android eclipse inputstream bufferedreader

我在阅读流时遇到错误。 Stream还包含图像和字符串数据。我的代码是,

static String convertStreamToString(java.io.InputStream is) {

    Reader reader = new InputStreamReader(is);
    BufferedReader r = new BufferedReader(reader);
    StringBuilder total = new StringBuilder();
    String line = null;
    try {

        while ((line = r.readLine()) != null) {

            total.append(line);
        }
    } catch (IOException e) {

        e.printStackTrace();
    }
    System.out.println(total);
    return line;  
}

在while循环中,它导致consol,因为它的堆内存正在增加,最后会出现错误"内存不足"

希望你的建议

2 个答案:

答案 0 :(得分:0)

您只是阅读整个文件并将其存储到StringBuilder中。您的文件太大而无法容纳在RAM中,并且当JVM无法为StringBuilder分配更多空间时,只会导致OutOfMemory错误。 要么找到一种不将整个文件存储在内存中的方法,要么使用较小的文件(以前的解决方案显然更好)。

另外,请注意您在使用后没有关闭缓冲的阅读器。执行此操作的正确方法是使用try-with资源声明资源,例如:

try(Reader reader = new InputStreamReader(is);
          BufferedReader r = new BufferedReader(reader)){
    //your code here
}

答案 1 :(得分:0)

您需要关闭您的信息流,正如其他人所说。但是你还有其他几件事需要考虑:

  1. 当您说 Stream还包含图像以及字符串数据时,您的意思是什么?你没有做任何事情来解决这个问题。您将其全部读作String s。如果文件确实包含图像和字符串,那么图像很可能比字符串大得多;如果你只是想要字符串,那么你需要找到一种过滤图像的方法。这可能会解决您的内存不足问题,并且还会阻止您在输出中使用废话。不幸的是,您还没有给我们足够的信息来帮助解决这个细节:它将取决于文件/流的格式。
  2. 如果文件很大,并且包含的​​字符串数据多于您可以存储在内存中的字符串数据,则无需仔细关闭流等等。您需要随时处理文件,而不是将其存储在RAM中。但是,如何执行此操作将取决于您尝试对数据执行的操作。
  3. 如果我是你,我会先攻击第一个问题。此刻,听起来即使您解决了内存问题,您仍然会得到无意义的输出,因为图像将被解码为String