Android - Сохранить большой XML-файл (Internal / SDCard)
Я хочу сохранить онлайн XML-файл очень большого размера (около 33 МБ). Я пытаюсь получить XML-файл в StringBuilder, преобразовать в строку, а затем сохранить файл во внутреннем хранилище / SDCard с помощью FileOutputStream.
Но мне не хватает памяти, и приложение вылетает. Сбой происходит, когда я пытаюсь получить значение в строке из StringBuilder.
Вот мой текущий код:
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost("sorry cant paste the actual link due copyrights.xml");
HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
is = httpEntity.getContent();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(
is, "iso-8859-1"), 8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
is.close();
String result = sb.toString();
System.out.println(result);
FileOutputStream fos = openFileOutput("test.xml", Context.MODE_PRIVATE);
fos.write(sb.toString().getBytes());
fos.close();
} catch (Exception e) {
Log.e("Buffer Error", "Error converting result " + e.toString());
}
2 ответа
Решение
Проблема вашего решения заключается в том, что для этого требуется много памяти приложения, поскольку строка XML полностью загружена в память.
Вы можете избежать этого, обрабатывая данные в маленьких блоках по 1 килобайту следующим образом:
is = httpEntity.getContent();
FileOutputStream fos = openFileOutput("test.xml", Context.MODE_PRIVATE);
byte[] buffer = new byte[1024];
int length;
while ((length = is.read(buffer))>0){
fos.write(buffer, 0, length);
}
fos.flush();
fos.close();
is.close();
Можете ли вы попробовать код ниже?
BufferedReader reader = new BufferedReader(new InputStreamReader(
is, "iso-8859-1"), 8);
FileOutputStream fos = openFileOutput("test.xml", Context.MODE_PRIVATE);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
if (sb.toString().length() > 10000) {
fos.write(sb.toString().getBytes());
fos.flush();
sb = new StringBuilder();
}
}
is.close();
fos.close();