用Java从文件中读取大量数据 [英] Read large amount of data from file in Java
问题描述
我有一个包含 1 000 002
个数字的文本文件,格式如下:
I've got text file that contains 1 000 002
numbers in following formation:
123 456
1 2 3 4 5 6 .... 999999 100000
现在我需要读取该数据并将其分配给 int
变量(前两个数字)和所有其余的(1 000 000 个数字)到一个数组int[]
.
Now I need to read that data and allocate it to int
variables (the very first two numbers) and all the rest (1 000 000 numbers) to an array int[]
.
这不是一项艰巨的任务,但是 - 这太慢了.
It's not a hard task, but - it's horrible slow.
Scanner stdin = new Scanner(new File("./path"));
int n = stdin.nextInt();
int t = stdin.nextInt();
int array[] = new array[n];
for (int i = 0; i < n; i++) {
array[i] = stdin.nextInt();
}
它正常工作,但执行需要大约 7500 毫秒.我需要在数百毫秒内获取该数据.
It works as excepted but it takes about 7500 ms to execute. I need to fetch that data in up to several hundred of milliseconds.
使用 BufferedReader.readLine()
和 String.split()
我在大约 1700 毫秒 内得到了相同的结果,但它仍然是很多.
Using BufferedReader.readLine()
and String.split()
I got the same results in about 1700 ms, but it's still too many.
我怎样才能在不到 1 秒的时间内读取这么多数据?最终结果应该等于:
How can I read that amount of data in less that 1 second? The final result should be equal to:
int n = 123;
int t = 456;
int array[] = { 1, 2, 3, 4, ..., 999999, 100000 };
根据垃圾神的回答:
StreamTokenizer
解决方案很快(大约需要 1400 毫秒)但它仍然太慢:
According to trashgod answer:
StreamTokenizer
solution is fast (takes about 1400 ms) but it's still too slow:
StreamTokenizer st = new StreamTokenizer(new FileReader("./test_grz"));
st.nextToken();
int n = (int) st.nval;
st.nextToken();
int t = (int) st.nval;
int array[] = new int[n];
for (int i = 0; st.nextToken() != StreamTokenizer.TT_EOF; i++) {
array[i] = (int) st.nval;
}
附注.无需验证.我 100% 确定 ./test_grz
文件中的数据是正确的.
PS. There is no need for validation. I'm 100% sure that data in ./test_grz
file is correct.
推荐答案
感谢您的每一个回答,但我已经找到了符合我的条件的方法:
Thanks for every answer but I've already found a method that meets my criteria:
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("./path"));
int n = readInt(bis);
int t = readInt(bis);
int array[] = new int[n];
for (int i = 0; i < n; i++) {
array[i] = readInt(bis);
}
private static int readInt(InputStream in) throws IOException {
int ret = 0;
boolean dig = false;
for (int c = 0; (c = in.read()) != -1; ) {
if (c >= '0' && c <= '9') {
dig = true;
ret = ret * 10 + c - '0';
} else if (dig) break;
}
return ret;
}
读取 100 万个整数只需要大约 300 毫秒!
It requires only about 300 ms to read 1 mln of integers!
这篇关于用Java从文件中读取大量数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!