【问题标题】:Buffer reader using input stream gives Out of Memory Error Android Java使用输入流的缓冲区读取器会出现内存不足错误 Android Java
【发布时间】:2015-01-24 18:19:59
【问题描述】:

我在读取流时出错。流还包含图像以及字符串数据。我的代码是,

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,最后给出错误“内存不足”

希望您的建议

【问题讨论】:

  • 在返回String之前尝试关闭InputStream。
  • r.close() 需要。 total.append(line).append("\n"); 左右,因为行没有行尾。 return total.toString(); 否则返回 ... null。
  • 在while循环中仍然出现内存不足的错误

标签: java android eclipse inputstream bufferedreader


【解决方案1】:

正如其他人所指出的,您确实需要关闭您的信息流。但是您还有其他一些事情要考虑:

  1. 您说Stream 还包含图像以及字符串数据 是什么意思?你没有做任何事情来处理这个问题。您正在以Strings 的身份阅读所有内容。如果文件确实包含图像和字符串,那么图像很可能比字符串大得多;如果你只想要字符串,那么你需要找到一种方法来过滤掉图像。这可能会解决您的内存不足问题,并且还可以防止您在输出中出现废话。不幸的是,您没有向我们提供足够的信息来帮助我们了解这方面的细节:这将取决于文件/流的格式。
  2. 如果文件很大,并且包含的​​字符串数据比内存中存储的多,那么仔细关闭流等任何操作都无济于事。您需要随时处理文件,而不是将其存储在 RAM 中。但是,您如何做到这一点将取决于您尝试对数据执行的操作。

如果我是你,我会从解决第一个问题开始。目前,听起来即使你解决了内存问题,你仍然会得到无意义的输出,因为图像将被解码为Strings。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-09
      • 1970-01-01
      • 1970-01-01
      • 2012-06-16
      • 1970-01-01
      • 2021-10-04
      • 2013-05-20
      相关资源
      最近更新 更多