【发布时间】:2015-08-07 03:52:47
【问题描述】:
我正在尝试尽可能快地读取一个大文本文件。
- 不以 '!' 开头的行被忽略了。
- 8 CSV 行的最后一个值被删除。
- 值中永远不会有“,”(不需要使用 opencsv)。
- 所有内容都添加到稍后解码的长字符串中。
这是我的代码
BufferedReader br = new BufferedReader(new FileReader("C:\\Users\\Documents\\ais_messages1.3.txt"));
String line, aisLines="", cvsSplitBy = ",";
try {
while ((line = br.readLine()) != null) {
if(line.charAt(0) == '!') {
String[] cols = line.split(cvsSplitBy);
if(cols.length>=8) {
line = "";
for(int i=0; i<cols.length-1; i++) {
if(i == cols.length-2) {
line = line + cols[i];
} else {
line = line + cols[i] + ",";
}
}
aisLines += line + "\n";
} else {
aisLines += line + "\n";
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
所以现在它在 14 秒内读取 36890 行。我还尝试了一个 InputStreamReader:
InputStreamReader isr = new InputStreamReader(new FileInputStream("C:\\Users\\Documents\\ais_messages1.3.txt"));
BufferedReader br = new BufferedReader(isr);
并且花费了相同的时间。有没有更快的方法来读取大型文本文件(100,000 或 1,000,000 行)?
【问题讨论】:
-
使用
StringBuilder进行字符串连接 -
分析你的代码,看看它现在把时间花在了哪里,然后看看你是否可以让慢的部分更快。
-
当值超过 8 个时会发生什么?在这种情况下,您的代码始终会删除最后一项。这真的是它应该表现的方式吗?
-
@SpiderPig 是的,通常 csv 有 7 个值,但有一个错误,它可能有第 8 个值会破坏解码器。
-
只要确保你知道如果有 9 个值会发生什么。 “取前 7 个”不同于“去掉最后一个”
标签: java bufferedreader