【发布时间】:2015-09-13 21:40:56
【问题描述】:
我注意到在读取大文件(在我的例子中是 CSV 文件)时使用java.util.Scanner 非常慢。
我想改变我目前读取文件的方式,以提高性能。以下是我目前所拥有的。请注意,我正在为 Android 开发:
InputStreamReader inputStreamReader;
try {
inputStreamReader = new InputStreamReader(context.getAssets().open("MyFile.csv"));
Scanner inputStream = new Scanner(inputStreamReader);
inputStream.nextLine(); // Ignores the first line
while (inputStream.hasNext()) {
String data = inputStream.nextLine(); // Gets a whole line
String[] line = data.split(","); // Splits the line up into a string array
if (line.length > 1) {
// Do stuff, e.g:
String value = line[1];
}
}
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
使用Traceview,我发现主要的性能问题,具体是:java.util.Scanner.nextLine()和java.util.Scanner.hasNext()。
我看过其他问题(例如this one),也遇到过一些CSV 阅读器,例如Apache Commons CSV,但他们似乎没有太多关于如何使用它们的信息,而且我不确定它们会快多少。
我也听说过在this one 之类的答案中使用FileReader 和BufferedReader,但同样,我不知道改进是否会显着。
我的文件长约 30,000 行,使用我目前拥有的代码(上图),从大约 600 行以下读取值至少需要 1 分钟,所以我没有计时需要多长时间读取 2,000 多行以下的值,但有时,在读取信息时,Android 应用会变得无响应并崩溃。
虽然我可以简单地更改部分代码并亲自查看,但我想知道是否有任何我没有提到的更快的替代方案,或者我是否应该只使用FileReader 和BufferedReader。将大文件拆分为较小的文件,并根据我要检索的信息选择读取哪个文件会更快吗?最好,我也想知道为什么最快的方法是最快的(即是什么让它快)。
【问题讨论】:
-
仅供参考,我有一个 140,000 字的“字典”(实际上只是一个单词列表),它使用
Scanner处理得非常快。但不是在安卓设备上。我知道您正在考虑的三个选择之间没有太大的性能差异。但我不是专家。 -
试试 BufferedReader
-
将读取操作设为Callable并扔到ExecutorService中
-
使用
BufferedReader.,您可以在一两秒内阅读数百万行,而 30,000 行应该几乎无法察觉。当您只阅读行时,没有理由使用Scanner。
标签: java android performance csv