有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java安卓是一种更有效的读取大文本文件的方法

我在Android应用程序中有一个很大的txt文件(1.5MB)作为私有资源
文件的结构如下:

"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");
...


为了阅读这个文件,我开发了一个reader类。。。但它看起来有点慢
这是:

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 :)
...


你觉得这个方法怎么样?它能以一种更有效的方式构建吗
我不在乎空间,我在乎时间(emulator需要很多时间来读取文件)


共 (1) 个答案

  1. # 1 楼答案

    我可以找到一个简单的调整,可以通过改善你花在这件事上的时间来加快你的速度: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将其全部加载到内存中可能会进一步提高性能