2016-11-26 20 views
0

我想从一个二进制文件构建一个hashmap。该二进制文件具有以下结构:第一个整数表示为了构建hashmap和键/值对,必须从流中读取的整数数量。DataInputStream奇怪的行为

因此,对于具有三个值我将具有总共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。

+0

关于每个线程都有自己的'DataInputStream'的线程,每个线程都读取它自己的文件吗? – Kayaman

+0

是的,每个线程都有自己的文件 – Aalto

回答

3

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