2011-01-06 9 views
2

私は、SDカードのテキストファイルから一度に1行ずつ読むのがかなり遅いことを確認しています。私はファイルが内部メモリにある場合、それが速いかもしれないと想像して、私はSDカードから内部ストレージにファイルをコピーしたいと思います。Androidファイルのコピー

ウェブ上にあるファイルコピーの例は、一度に1バイトをInputStreamからOutputStreamに、またはFileReaderからFileWriterにコピーすることを含んでいるようです。これは本当に最も迅速かつ効率的な方法ですか?

+0

FWIW、一部のデバイスにSDカードが内蔵フラッシュよりも高速です。いくつかのI/Oベンチマークを試してみてください。 – fadden

+0

ありがとうございます。 (実際、私はI/O速度が私にとって大きな問題ではないことに気付きました...私がHTML形式のテキストを表示するために使っていた方法は非常に効率が悪く、大きな遅延を引き起こしていました。別のスレッドで議論しました) – prepbgg

答えて

7

あなたのアプリケーションで使用するためにファイルを引っ張っているのであれば、データを読み込み、あなたが何らかの種類のリーダー(BufferedReaderおそらく)に収集したメモリデータを読み込んで読み込むことができますそこからの線。ここで

は、私は一般的に何をすべきかの例です:

// Assumption: I already have the file object I want to read 
// Note: I'm not doing any error handling. 
InputStream input = new FileInputStream(file); 
ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
byte[] buffer = new byte[1024]; 
int bytesRead = 0; 
while((bytesRead = input.read(buffer)) > 0){ 
    baos.write(buffer, 0, bytesRead); 
} 
StringReader stringReader = new StringReader(new String(baos.toByteArray())); 
BufferedReader bufferedReader = new BufferedReader(stringReader); 
for(String line : bufferedReader.readLine()){ 
    // TODO: Handle each line appropriately or something 
    Log.d("Reading Data Example", line); 
} 
+0

ありがとうございます。それは私が必要とするもののように見えます(2メガバイトを保持するのに十分な大きさのByteArrayがあると仮定して)。 – prepbgg

+0

OK。私はあなたのサンプルコードに従っており、うまくいくようです。しかし、結果として、BAOSとStringReaderを介した読み込みは単に 'BufferedReader br = new BufferedReader(new FileReader(file));'を使うよりも少し遅いようです。これによりLogCatを使用してタイミングをより慎重に見ていました。ファイルからテキストを読み込むプロセスが非常に速く、SDカードから読み込むことさえあります。今私は間違った質問をしたことが分かります。 ... – prepbgg

+0

...大きな問題は、抽出されたテキストを表示するのにかかる時間です。私のコードは、入力ファイルから選択された行をStringBuilderオブジェクトsbに読み込み、 'tv.setText(Html.fromHtml(sb.toString()));'を使用してTextViewに表示します; 50行目(または段落)平均化1行あたり約1KB 3行のコード: '\t \t setContentView(R.layout.displaytext); \t \t TextView tv =(TextView)findViewById(R.id.display_text); \t \t tv.setText(Html.fromHtml(text.toString())); '処理に5秒以上かかるこのディスプレイをスピードアップする方法についてのご意見はありますか?これを新しい質問として尋ねるべきですか? – prepbgg

1

CPUが高速化するにつれて、時間の経過とともに真実になるCSの真実は、です。入出力が遅いです。

スピードをお望みの場合は、のように、ほとんどの場合、のI/Oはほとんど行いません。理想的には、そのファイルの大きさを調べて、それほど多くのメモリを割り当ててから、全体を1つの大きなI/Oで読み込みます。その後、プログラムメモリからデータにアクセスできます。すべてのコンクリートファイルサイズに対して十分なRAMがない場合は、もう少し作業をしなければならないかもしれませんが、これはあなたが努力すべきものです。

+0

あなたの非常に迅速な答えをありがとう。私の最大テキストファイルサイズはおそらく2メガバイト未満であり、テキストの「行」は何キロバイトまでのものであってもかまいません。私はBufferedReaderを使用して、SDカードから一度に1行ずつ読み込んでいます。ファイルを保持するのに最適なデータ構造と、SDから一括して読み込み、一度に1行ずつプログラムメモリから読み込む方法をお勧めしますか? – prepbgg

+0

あなたの目標がHTMLデータを処理することであれば、おそらくストリーミングパーサーを調べるべきでしょう。私は、apacheのライブラリやxercesがこれを実現できると信じています。また、私はこのページをアンドロイドの開発者のドキュメントで見つけました。 http://developer.android.com/training/basics/network-ops/xml.html – iHearGeoff