首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RandomAccessFile readInt

RandomAccessFile readInt
EN

Stack Overflow用户
提问于 2010-12-03 00:45:26
回答 4查看 2.8K关注 0票数 0

如何从文件中读取数字?

当我使用readInt方法时,我得到一个很大的数字,它不等于一个文件中的数字。

如何修复?

扫描仪不是好主意,因为文件包含超过1000万个数字…这需要很长时间..。

是的,文本文件。

文件中包含数字分隔的空格符号。例如( test.txt )

1 2 4 -4004 15458 8876

代码语言:javascript
复制
   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();
      }
   }

所以,我附上一份报告:

代码语言:javascript
复制
// operation: time
reading: 39719   // t0
reading: 28297   // t1
reading: 56719   // t2
reading: 125735  // t3
reading: 199000  // t4

t0 < t1 < t2 < t3 < t4

如何改变我的程序的行为,得到这个: t0 ~ t1 ~ t2 ~ t3 ~ t4?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-12-03 00:51:22

如果您想随机访问数据,您需要能够确定从哪里开始,从哪里结束。对于文本格式,这可能很棘手,您可能必须阅读前面的所有行/文本才能找到所需的行/文本。

使用二进制格式,您可能能够准确地计算您想要读取的位置,但您需要知道数字是如何编码的。例如,它是大端还是小端?

扫描仪对于文本可能不是最优的,而对于二进制数据则无用,但如果足够快的话。

扫描一个大文件所花费的大部分时间是从磁盘上读取的时间(假设它无法装入内存)如果文件压缩良好,你可以大大加快速度,例如,充满数字的文本就可以。如果进行压缩,可能只需要2秒,而不是需要20秒才能读取。(它可能放入操作系统文件缓存中)

票数 1
EN

Stack Overflow用户

发布于 2010-12-03 01:02:30

数量较大的一个可能原因可能是字节排序。默认情况下,Java在从通道读取数据时使用Big Endian。如果您正在读取的文件是Little Endian,那么小数字将会变大,因为最低有效字节将成为最高有效字节。

您可以使用order方法更改ByteBuffer的字节顺序。

票数 2
EN

Stack Overflow用户

发布于 2010-12-03 01:29:00

这完全取决于数字是如何存储的。

我猜简短的答案是:无论如何,你必须知道数字从哪里开始,从哪里结束,它是以文本还是二进制存储的,如果它是二进制的,那么字节顺序是什么,即小端还是大端。

如果它存储为文本,则从数字构建一个字符串,然后对该字符串调用Integer.parseInt。(对于其他数据类型,如果是浮点数,则为Double.parseDouble等。)

如果它存储为二进制整数,则将字节读入数组,或者逐个读取,然后乘以256的幂,然后相加。

例如,假设您有一个小端顺序的四字节数字。您将其读入一个大小为4的字节数组中。然后:

代码语言:javascript
复制
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;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4337485

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档