如何从文件中读取数字?
当我使用readInt方法时,我得到一个很大的数字,它不等于一个文件中的数字。
如何修复?
扫描仪不是好主意,因为文件包含超过1000万个数字…这需要很长时间..。
是的,文本文件。
文件中包含数字分隔的空格符号。例如( test.txt )
1 2 4 -4004 15458 8876
public static void readByMemoryMappedFile(int buffer[], String filename) throws IOException
{
int count = 0;
RandomAccessFile raf = new RandomAccessFile(filename, "r");
try {
MappedByteBuffer mapFile = raf.getChannel().map(MapMode.READ_ONLY, 0, raf.length());
StringBuilder b = new StringBuilder();
try {
while (mapFile.hasRemaining()) {
byte read = mapFile.get();
if (read == ' ' && b.length() > 0) {
buffer[count++] = mapFile.getInt();//Integer.parseInt(b.toString());
b.delete(0, b.length());
} else {
b.append((char) read);
}
}
} catch (BufferUnderflowException e) {
// Всё, файл закончился
}
if (b.length() > 0) {
buffer[count++] = Integer.parseInt(b.toString());
}
} finally {
raf.close();
}
}所以,我附上一份报告:
// operation: time
reading: 39719 // t0
reading: 28297 // t1
reading: 56719 // t2
reading: 125735 // t3
reading: 199000 // t4t0 < t1 < t2 < t3 < t4
如何改变我的程序的行为,得到这个: t0 ~ t1 ~ t2 ~ t3 ~ t4?
发布于 2010-12-03 00:51:22
如果您想随机访问数据,您需要能够确定从哪里开始,从哪里结束。对于文本格式,这可能很棘手,您可能必须阅读前面的所有行/文本才能找到所需的行/文本。
使用二进制格式,您可能能够准确地计算您想要读取的位置,但您需要知道数字是如何编码的。例如,它是大端还是小端?
扫描仪对于文本可能不是最优的,而对于二进制数据则无用,但如果足够快的话。
扫描一个大文件所花费的大部分时间是从磁盘上读取的时间(假设它无法装入内存)如果文件压缩良好,你可以大大加快速度,例如,充满数字的文本就可以。如果进行压缩,可能只需要2秒,而不是需要20秒才能读取。(它可能放入操作系统文件缓存中)
发布于 2010-12-03 01:02:30
数量较大的一个可能原因可能是字节排序。默认情况下,Java在从通道读取数据时使用Big Endian。如果您正在读取的文件是Little Endian,那么小数字将会变大,因为最低有效字节将成为最高有效字节。
您可以使用order方法更改ByteBuffer的字节顺序。
发布于 2010-12-03 01:29:00
这完全取决于数字是如何存储的。
我猜简短的答案是:无论如何,你必须知道数字从哪里开始,从哪里结束,它是以文本还是二进制存储的,如果它是二进制的,那么字节顺序是什么,即小端还是大端。
如果它存储为文本,则从数字构建一个字符串,然后对该字符串调用Integer.parseInt。(对于其他数据类型,如果是浮点数,则为Double.parseDouble等。)
如果它存储为二进制整数,则将字节读入数组,或者逐个读取,然后乘以256的幂,然后相加。
例如,假设您有一个小端顺序的四字节数字。您将其读入一个大小为4的字节数组中。然后:
byte[] incoming=new byte[4];
file.read(incoming);
int n=0;
for (int p=0;p<4;++p)
n=n*256+incoming[p];
return n;https://stackoverflow.com/questions/4337485
复制相似问题