0

サイズが非常に大きいオンライン xml ファイル (約 33 MB) を保存したいと考えています。StringBuilder で xml ファイルを取得し、文字列に変換してから、FileOutputStream で内部ストレージ/Sdcard にファイルを保存しようとしています。

しかし、私はメモリ不足になり、アプリがクラッシュします。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());
    }
4

2 に答える 2

2

魂の問題は、xml-stringが完全にメモリに格納されるため、大量のアプリメモリが必要になることです。

これを回避するには、次のように1kbの小さなチャンクでデータを処理します。

    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();
于 2012-04-23T09:31:51.267 に答える
1

以下のコードを試してみてください。

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();
于 2012-04-23T09:10:23.780 に答える