我有一个大文本文件(+ 100MB),每行是一个整数(包含1000万个数字)。当然,尺寸和数量可能会有所变化,所以我事先并不知道。
我想将文件加载到ECHO is off.
ECHO is off.
ECHO is off.
ECHO is off.
ECHO is off.
ECHO is off.
ECHO is off.
ECHO is off.
0
1
2
3
4
5
6
,使过程尽可能快。首先我来到这个解决方案:
int[]
非常快,5.5秒。其中,5.1s用于public int[] fileToArray(String fileName) throws IOException
{
List<String> list = Files.readAllLines(Paths.get(fileName));
int[] res = new int[list.size()];
int pos = 0;
for (String line: list)
{
res[pos++] = Integer.parseInt(line);
}
return res;
}
调用,而0.4s用于循环。
但后来我决定尝试使用BufferedReader,并找到了这个不同的解决方案:
readAllLines
这更快! 3.1秒,public int[] fileToArray(String fileName) throws IOException
{
BufferedReader bufferedReader = new BufferedReader(new FileReader(new File(fileName)));
ArrayList<Integer> ints = new ArrayList<Integer>();
String line;
while ((line = bufferedReader.readLine()) != null)
{
ints.add(Integer.parseInt(line));
}
bufferedReader.close();
int[] res = new int[ints.size()];
int pos = 0;
for (Integer i: ints)
{
res[pos++] = i.intValue();
}
return res;
}
循环只需3秒,而while
循环甚至不到0.1秒。
我知道这里没有太多的优化空间,至少在时间上,但是使用ArrayList然后使用int []对我来说似乎有太多的记忆。
关于如何加快速度,或避免使用中间ArrayList的任何想法?
为了进行比较,我使用for
类和TStringList
函数在1.9秒内使用FreePascal执行相同的任务[请参阅编辑]。
编辑:由于我使用Java方法的时间很短,我不得不改进FreePascal。 330〜360ms。
答案 0 :(得分:7)
如果您正在使用Java 8,则可以使用lines()
消除此中间ArrayList
,然后映射到int
,然后将值收集到数组中。< / p>
您还应该使用try-with-resources进行正确的异常处理和自动关闭。
try (BufferedReader br = new BufferedReader(new FileReader(fileName))) {
return br.lines()
.mapToInt(Integer::parseInt)
.toArray();
}
我不确定这是否更快,但维护起来肯定要容易得多。
编辑:显然要快得多。