我使用以下两个,但不适用于 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");
}
我使用以下两个,但不适用于 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");
}
将数据分块保存到 SD 卡中。然后,使用 Android 的内置XmlPullParser
,您可以通过以下方式解析之前保存的文件:
setInput(InputStream inputStream, String inputEncoding)
读取部分 1mb 数据并使用 SAXParser 进行解析
为什么不分块读取 XML 并将每个块保存到 SD 卡?此解决方案中的唯一问题是您需要某种 XML 流解析器,使用它您可以动态加载部分 XML 并解析它们。
可能您可以使用用于 XML 的 Streaming API,称为 StaX,并为这种情况编写自定义输入流。一些例子http://www.vogella.com/articles/JavaXML/article.html#javastax
注意:您需要在非主线程上执行此操作,下载文件可能需要很长时间。(无论如何你不能在 UI 线程上做网络任务)。这应该是节省内存的,XmlPullParser 不会将数据缓存在内存中。无需先将文件存储到 SD 卡。
还要注意错误:连接超时、xml 中的错误等。当解析器报告它到达文档末尾时,将您的工作视为成功。
您可能应该尝试将整个 12mb 分配到内存中,然后检查分配是否成功。然后将数据加载到缓冲区。
或者,如果您能够分部分加载文件并对其进行处理,那么这种方式应该是有效的。
您需要解析整个 XML 流并创建一个巨大的 DOM 对象,还是需要解析块?
如果您必须解析完整的 XML,那么您唯一能做的就是获得更多内存和 64 位操作系统。
如果没有,请使用 SAX 或 StAX 解析器直接从流中或在本地保存后获取和解析块。
正如用户必须指出的那样,我建议逐块下载而不是一次下载整个文件,因为如果您在主线程上执行它可能会减慢您的所有应用程序,因此使用 asynctask 执行它并按块执行块。除此之外,我可以向您推荐一些有关该主题的帖子。
-在这篇文章中,您可以找到有关如何使用 SAX的文章的链接
-在这个你可以找到另一个SAX 和 DOM 教程
我希望这两篇文章可以帮助你实现你所需要的。或者,如果两篇文章都因您的问题而失败,那么您可能会尝试找到一种更好的方式来安排您的 XML,总有更好的方式来做,您只需要更加努力地思考。
更新:
-有关STAX的另一篇文章可能会有所帮助,因为它是用于 XML 处理的 STreaming Api,因此它可能最适合您的情况。
我有同样的问题,我使用这个,如果可能的话,你应该分割 xml 文件,然后尝试将该文件读入字符串并解析它。