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();
Другие вопросы по тегам