【问题标题】:Why no readUnsignedInt in RandomAccessFile class?为什么 RandomAccessFile 类中没有 readUnsignedInt?
【发布时间】:2026-01-29 00:25:01
【问题描述】:

我刚刚发现RandomAccessFile 类中没有readUnsignedInt() 方法。为什么?是否有任何解决方法可以从文件中读取 unsigned int?

编辑:

我想从文件中读取一个无符号整数并将其放入一个长空格中。

编辑2:

不能使用 readLong()。它将读取 8 个字节而不是 4 个字节。文件中的数据在 4 字节范围内具有无符号整数。

编辑3:

在这里找到答案:http://www.petefreitag.com/item/183.cfm

编辑4:

如果数据文件是小端的呢?我们需要先进行位交换吗?

【问题讨论】:

  • Java 不支持无符号整数。 *.com/questions/430346/…
  • @Swati:嗯,他们可以像readUnsignedShort() 那样做,它读取 2 个字节并返回一个 int:读取 4 个字节并返回一个 long。
  • 他们也可以实现 unsigned int,但你能做什么。
  • Pete freitag 的回答相当冗长。 JDK 本身提供了许多排序器、更简单的解决方案。

标签: java


【解决方案1】:

因为java中没有unsigned int类型? 为什么不readLong() ? 您可以 readLong 然后取前 32 位。

编辑 你可以试试

long value = Long.parseLong(Integer.toHexString(file.readInt()), 16);

【讨论】:

  • 因为java中没有unsigned int类型?嗯,其实还有readUnsignedByte...
  • 然后使用seek()返回4个字节,因为readLong()消耗了太多字节?
  • @aioobe,是的,抱歉,没有注意到这些方法。
  • 没什么私人的,我认为这两种解决方案都很糟糕。第一个消耗太多字节,第二个创建一个十六进制字符串并解析它?! Java 不是脚本语言。为什么这个答案有这么多赞成?
  • @musiKk,这取决于您如何衡量代码的“节拍”。如果您需要速度 - 是的,我的解决方案很糟糕。但是,如果您不太关心速度,它是比从字节数组创建长的更小的解决方案。虽然我知道如果有人使用 RandomAccessFile,他可能需要速度。
【解决方案2】:

编辑删除readLong():

您可以使用readFully(byte[] b, int off, int len),然后使用此处的方法转换为LongHow to convert a byte array to its numeric value (Java)?

【讨论】:

  • 如果文件中的数字是 4 个字节长,这将无济于事。 readLong() 读取 8 个字节。
【解决方案3】:

我会这样做:

long l = file.readInt() & 0xFFFFFFFFL;

位操作是必要的,因为向上转换会扩展一个负号。


关于字节序。据我所知,Java 中的所有 I/O 都是以大端方式完成的。当然,通常没关系(字节数组、UTF-8 编码等不受字节序影响)但DataInput 的许多方法都是。如果你的号码是以小端存储的,你必须自己转换。我所知道的标准 Java 中唯一允许配置字节序的工具是 ByteBuffer 通过 order() 方法,但是你打开了 NIO 的大门,我对此没有太多经验。

【讨论】:

  • 是的,这是更好的解决方案:)
  • 请注意,如果没有 0xFFFFFFFF 末尾的“L”,此解决方案将不起作用,如果您的数字为负数,则如果没有 L,您的 long 也将是负数
【解决方案4】:

根据您对int 所做的操作,您可能不需要将其转换为long。您只需要了解您正在执行的操作。毕竟它只有 32 位,您可以根据需要将其视为有符号或无符号。

如果您想使用 ByteOrder,最简单的方法可能是使用 ByteBuffer,它允许您设置字节顺序。如果您的文件小于 2 GB,您可以将整个文件映射到内存中并随机访问 ByteBuffer。

【讨论】: