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 也不算多,也许使用 a 将其全部加载到内存中BufferedReader可能会进一步提高您的性能。

于 2012-10-03T12:07:15.523 回答