次の両方を使用しますが、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 ストリーム パーサーが必要なことです。
この場合、StaX と呼ばれる Streaming API for XML を使用して、カスタム入力ストリームを作成できる場合があります。例http://www.vogella.com/articles/JavaXML/article.html#javastax
注: これはメイン スレッド以外で行う必要があります。ファイルのダウンロードに時間がかかる場合があります。(とにかく、UI スレッドでネットワーク タスクを実行することはできません)。XmlPullParser はデータをメモリにキャッシュしません。最初にファイルを SD カードに保存する必要はありません。
エラーにも注意してください: 接続タイムアウト、xml のエラーなど。パーサーがドキュメントの最後に達したことを報告したら、ジョブを成功として扱います。
ユーザーのマストが述べているように、ファイル全体ではなくチャンクごとにダウンロードすることをお勧めします。メイントレッドで実行すると、すべてのアプリケーションの速度が低下する可能性があるため、asynctaskで実行してチャンクで実行してください。チャンク。それとは別に、私はあなたにトピックについてのいくつかの投稿をお勧めすることができます。
-この投稿では、 SAXの使用方法に関する記事へのリンクを見つけることができます
-これには、別のSAXおよびDOMチュートリアルがあります。
この2つの記事が、必要なことを達成するのに役立つことを願っています。または、両方の記事が問題で失敗した場合は、XMLを配置するためのより良い方法を見つけようとするかもしれません。それを行うためのより良い方法は常にあります。少し難しいことを考える必要があります。
アップデート:
-STAXに関するこの他の投稿が役立つ場合があります。原因は、XML処理用のSTReaming Apiであるため、この場合に最適な場合があります。
XML ストリーム全体を解析して 1 つの巨大な DOM オブジェクトを作成する必要がありますか? それともチャンクを解析する必要がありますか?
完全な XML を解析する必要がある場合は、メモリと 64 ビット OS を増やすしかありません。
そうでない場合は、SAX または StAX パーサーを使用して、ストリームから直接、またはローカルに保存した後にチャンクを取得して解析します。
おそらく、12MB 全体をメモリに割り当ててから、割り当てが成功するかどうかを確認する必要があります。次に、データをバッファにロードします。
または、ファイルを分割してロードして処理できる場合は、この方法で効率的に処理できます。
私は同じ問題を抱えていて、これを使用しています。可能であればxmlファイルを分割してから、そのファイルを文字列に読み取って解析してみてください。