Я пытаюсь проанализировать довольно большой XML файл - 1 МБ +, но у меня возникают некоторые трудности. Сначала я попытался добавить файл xml в res/xml и проанализировать его с помощью XmlResourceParser, но у меня появилось исключение: "Данные превышают UNCOMPRESS_DATA_MAX". После небольшого исследования я узнал, что сжатые файлы должны быть несжаты в памяти перед чтением и что это ограничение не распространяется на сырые файлы. Однако при попытке проанализировать XML файл из папки res/raw с помощью SAXParser, я получаю исключение IOException без каких-либо сообщений и stacktrace:
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
XMLReader xr = sp.getXMLReader();
xr.setContentHandler(myXMLHandler);
InputSource src = new InputSource(stream);
xr.parse(src); // IOException
Насколько я понимаю, эти ограничения памяти не применяются к исходным ресурсам, но что вызывает это исключение?
Вот stacktrace из logcat:
11-11 23:47:50.729: WARN/System.err(4886): java.io.IOException
11-11 23:47:50.739: WARN/System.err(4886): at android.content.res.AssetManager.readAsset(Native Method)
11-11 23:47:50.749: WARN/System.err(4886): at android.content.res.AssetManager.access$800(AssetManager.java:36)
11-11 23:47:50.759: WARN/System.err(4886): at android.content.res.AssetManager$AssetInputStream.read(AssetManager.java:542)
11-11 23:47:50.759: WARN/System.err(4886): at org.apache.harmony.xml.ExpatParser.parseFragment(ExpatParser.java:504)
11-11 23:47:50.769: WARN/System.err(4886): at org.apache.harmony.xml.ExpatParser.parseDocument(ExpatParser.java:467)
11-11 23:47:50.779: WARN/System.err(4886): at org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:329)
11-11 23:47:50.790: WARN/System.err(4886): at org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:286)
Разделите файл с помощью этой команды linux split -l 1 main.xml
private String readTxt()
{
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
for(int J=1;J<15;J++)
{
int i;
try
{
InputStream raw = this.getAssets().open("xa"+J);
i = raw.read();
while (i != -1)
{
byteArrayOutputStream.write(i);
i = raw.read();
}
raw.close();
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Использовать как строку в вашем анализе SAX.