12

我使用以下两个,但不适用于 12 mb 的大量数据

char[] chars = new char[1024];
int len;
while((len=buffer.read(chars))>0) {
    data.append(chars,0,len);
}

while ((line = reader.readLine()) != null) {
    sb.append(line + "\n");
}
4

8 回答 8

8

将数据分块保存到 SD 卡中。然后,使用 Android 的内置XmlPullParser,您可以通过以下方式解析之前保存的文件:

  1. 在刚刚下载的文件上打开一个输入流
  2. 使用方法setInput(InputStream inputStream, String inputEncoding)
  3. 在解析这个巨大的 XML 文件时玩得开心。
于 2012-07-27T08:00:00.310 回答
3

读取部分 1mb 数据并使用 SAXParser 进行解析

于 2012-08-01T10:59:17.190 回答
2

为什么不分块读取 XML 并将每个块保存到 SD 卡?此解决方案中的唯一问题是您需要某种 XML 流解析器,使用它您可以动态加载部分 XML 并解析它们。

可能您可以使用用于 XML 的 Streaming API,称为 StaX,并为这种情况编写自定义输入流。一些例子http://www.vogella.com/articles/JavaXML/article.html#javastax

于 2012-07-27T07:42:53.910 回答
2
  1. 创建 XmlPullParser 实例
  2. 使用您的输入(Reader 或 InputStream)调用 XmlPullParser.setInput;那就是你下载的数据(通过Socket或其他方式)
  3. 使用 XmlPullParser 的函数来解析您的 xml 文本文件。

注意:您需要在非主线程上执行此操作,下载文件可能需要很长时间。(无论如何你不能在 UI 线程上做网络任务)。这应该是节省内存的,XmlPullParser 不会将数据缓存在内存中。无需先将文件存储到 SD 卡。

还要注意错误:连接超时、xml 中的错误等。当解析器报告它到达文档末尾时,将您的工作视为成功。

于 2012-07-30T05:44:34.510 回答
1

您可能应该尝试将整个 12mb 分配到内存中,然后检查分配是否成功。然后将数据加载到缓冲区。

或者,如果您能够分部分加载文件并对其进行处理,那么这种方式应该是有效的。

于 2012-07-27T07:42:37.793 回答
1

您需要解析整个 XML 流并创建一个巨大的 DOM 对象,还是需要解析块?

如果您必须解析完整的 XML,那么您唯一能做的就是获得更多内存和 64 位操作系统。
如果没有,请使用 SAX 或 StAX 解析器直接从流中或在本地保存后获取和解析块。

于 2012-08-02T19:31:12.137 回答
1

正如用户必须指出的那样,我建议逐块下载而不是一次下载整个文件,因为如果您在主线程上执行它可能会减慢您的所有应用程序,因此使用 asynctask 执行它并按块执行块。除此之外,我可以向您推荐一些有关该主题的帖子。

-在这篇文章中,您可以找到有关如何使用 SAX的文章的链接

-在这个你可以找到另一个SAX 和 DOM 教程

我希望这两篇文章可以帮助你实现你所需要的。或者,如果两篇文章都因您的问题而失败,那么您可能会尝试找到一种更好的方式来安排您的 XML,总有更好的方式来做,您只需要更加努力地思考。

更新:

-有关STAX的另一篇文章可能会有所帮助,因为它是用于 XML 处理的 STreaming Api,因此它可能最适合您的情况。

于 2012-08-02T21:45:03.997 回答
-1

我有同样的问题,我使用这个,如果可能的话,你应该分割 xml 文件,然后尝试将该文件读入字符串并解析它。

于 2012-08-03T06:50:26.940 回答