DataInputStream 奇怪的行为

DataInputStream strange behaviour

我想从二进制文件构建哈希图。这个二进制文件具有以下结构:第一个整数表示我必须从流中读取的整数数量,以便构建哈希图,后跟 key/value 对。

所以对于具有三个值的哈希图,我总共有 7 个整数:

1 int 读取 - 2 键 - 3 值 - 4 键 - 5 值 - 6 键 - 7 值

下面两个代码怎么可能有两个不同的结果?唯一的区别是,在第一个示例中,我使用辅助变量 a 来存储要读取的字节的值。在第二个中,我直接在 for 循环中使用它。

static Int2IntMap fetchHashMap(Int2IntMap map, DataInputStream DIS) throws IOException {
    int a = DIS.readInt();
    for (int i = 0; i < a; i++) {
        map.put(DIS.readInt(),DIS.readInt());
    }
    return map;
}

这是没有辅助变量的代码:

static Int2IntMap fetchHashMap(Int2IntMap map, DataInputStream DIS) throws IOException {
    for (int i = 0; i < DIS.readInt(); i++) {
        map.put(DIS.readInt(),DIS.readInt());
    }
    return map;
}

前者的效果比后者好,但仍然与我期望的结构不一致。

我不知道它是否相关,但我的实现使用多线程,但每个线程都有自己的 DataInputStream。

for 循环的整个条件在每次迭代之前执行。在您的第二种方法中,i < DIS.readInt();each 迭代之前运行,从 DIS 读取新的 int。你的第一个方法是正确的,只读取一次并缓存值。