1

Android アプリケーションのプライベート リソースとして大きな txt ファイル (1.5 Mb) があります。
ファイルは次のように構成されています。

"A1|A2|A3|A4#B1|B2|B3|B4#C1|C2|C3|C4#..."


ここで、A1、A2、A3、B1... は英数字の文字列です。次のように、文字列のグループごとにオブジェクトを作成する必要があります。

MyObject objA = new MyObject("A1", "A2", "A3", "A4");
MyObject objB = new MyObject("B1", "B2", "B3", "B4");
...


このファイルを読み取るためにリーダー クラスを開発しましたが、少し遅いようです。
ここにあります:

public class TextFileReader {

    private static Charset charset = Charset.defaultCharset();
    private InputStream stream;
    private InputStreamReader reader;
    private StringBuffer buffer;

    public TextFileReader(Context c, String s) {
        try {
            this.stream = c.openFileInput(s);
            this.reader = new InputStreamReader(this.stream, charset);
            this.buffer = new StringBuffer();
        } catch (FileNotFoundException e) {
        }
    }

    public String readNextSubstring(char div) throws IOException {
        buffer.delete(0, buffer.length());
        int i;
        char c;
        while ((i = reader.read()) > -1) {
            c = (char) i;
            if (c == div) break;
            buffer.append(c);
        }
        return buffer.toString();
    }
}


TextFileReaderはこのように使用します:

TextFileReader reader = new TextFileReader(context, "big_file.txt");

//First group
String group = reader.readNextSubstring('#');
String[] info = group.split("\\|");
MyObject objA = new MyObject(info[0], info[1], info[2], info[3]);

//Second group
group = reader.readNextSubstring('#');
info = group.split("\\|");
MyObject objB = new MyObject(info[0], info[1], info[2], info[3]);

//Obviously this is done in a while loop :)
...


この方法についてどう思いますか?より効率的な方法で構造化できますか?
スペースは気にしませんが、時間は気にします (エミュレーターはファイルを読み取るのに多くの時間がかかります)

4

1 に答える 1

2

これを行うのに費やす時間を改善するだけで、速度を上げることができる簡単な微調整を見つけることができます。group.split("\\|");

Java が行う方法は、この行を実行するたびに、新しいregex.

これを行う場合:

Pattern pattern = Pattern.compile("\\|");
TextFileReader reader = new TextFileReader(context, "big_file.txt");

while (reader.hasMoreData) 
{
  String group = reader.readNextSubstring('#');
  String[] info = pattern.split(group);
  MyObject objA = new MyObject(info[0], info[1], info[2], info[3]);
  ...
}

これにより、パターンのコンパイルにかかる時間が短縮されます。これは、データ量に対してかなりの時間を要する場合があります。

また、1.5MB はそれほど多くはありません。おそらく、を使用してすべてをメモリにロードするとBufferedReader、パフォーマンスがさらに向上するでしょう。

于 2012-10-03T12:07:15.523 に答える