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 楼答案
我可以找到一个简单的调整,可以通过改善你花在这件事上的时间来加快你的速度:
group.split("\\|");
java的做法是,每次运行这一行时,它都会编译一个新的
regex
如果你这样做:
这将减少编译模式所需的时间——这对于您的数据量来说是相当可观的
此外,1.5MB并不是那么多,也许使用
BufferedReader
将其全部加载到内存中可能会进一步提高性能