3

次のコードは機能しますが、小さなファイルを開くには時間がかかりすぎます (1 分以上)。LogCat には、「GC_FOR_MALLOC が解放された #### オブジェクト / ###### バイト (##ms)」のインスタンスが多数表示されます。助言がありますか?

 File dirPath = new File(Environment.getExternalStorageDirectory(), "MyFolder");
 String content = getFile("test.txt");

 public String getFile(String file){
  String content = "";
  try {
   File dirPathFile = new File(dirPath, file);
   FileInputStream fis = new FileInputStream(dirPathFile);
   int c;
   while((c = fis.read()) != -1) {
    content += (char)c;
   }
   fis.close();
  } catch (Exception e) {
   getLog("Error (" + e.toString() + ") with: " + file);
  }
  return content;
 }

アップデート:

これは今のように見えます:

File dirPath = new File(Environment.getExternalStorageDirectory(), "MyFolder");
String content = getFile("test.txt");

public String getFile(String file){
    String content = "";
    File dirPathFile = new File(dirPath, file);
    try {
        StringBuilder text = new StringBuilder();
        BufferedReader br = new BufferedReader(new FileReader(dirPathFile));
        String line;
        while ((line = br.readLine()) != null) {
            text.append(line);
            text.append('\n');
        }
        content = new String(text);
        } catch (Exception e) {
            getLog("Error (" + e.toString() + ") with: " + file);
    }
    return content;
}

皆さん、ありがとうございました!!

4

6 に答える 6

6

+=String での使用は非常に非効率的です。これは、メモリの割り当てと割り当て解除を常に行うため、回避する必要があります。

常に文字を追加する必要がある場合は、 a を使用してStringBuilder、事前に十分な大きさのバッファーを与えます。

ただし、ファイル全体をバイト配列として読み取り、そのバイト配列から文字列を作成する方がより適切です。String(byte[])コンストラクターを使用します。

于 2010-12-01T21:53:01.410 に答える
2

コンテンツ += (文字)c;

さて、これがあなたの問題です。繰り返し実行する必要がある場合、文字列の連結は遅くなります。また、一度に 1 文字ずつファイルを読み取っていますが、これも非常に低速です。

メソッドを使用してread(byte[] buffer)、ファイルをバッファに効率的に読み込む必要があります。そして、必要に応じてバッファを文字列化できます。

于 2010-12-01T21:52:05.730 に答える
2

一度に 1 バイトずつ読み取るのではなく、read(byte[])を使用して複数読み取る必要があります。

また、文字列は不変であるため、毎回 String s = s + "a"; を実行します。新しい String オブジェクトを作成している可能性があります。代わりにStringBuilderを使用して、より大きな文字列を作成できます。

于 2010-12-01T21:52:59.407 に答える
2

画家のシュレミエルが再び襲い掛かる!

于 2010-12-01T21:54:53.783 に答える
0

buffer read(byte[] buff)で読み込もうとする

于 2010-12-01T21:52:10.487 に答える
0

理由は次のとおりです。

  1. 作成する String オブジェクトが多すぎますcontent += (char)c;。代わりに StringBuilder を使用して読み取りデータを追加し、最後に StringBuilder で toString() を呼び出します。
  2. ファイルから読み取るために byte[] (または char[]、実装によって異なります) バッファーを使用しません。通常、1バイトずつ読み取るのではなく、1KBのバッファが最適です。
于 2010-12-01T21:59:46.980 に答える