2016-11-26 19 views
0

バイナリファイルからハッシュマップを構築したいと思います。このバイナリファイルには、次の構造があります。最初の整数は、ハッシュマップとそれに続くキーと値のペアを作成するためにストリームから読み取る必要がある整数の数を示します。 - キー2 - 3値 - 4キー - 5値 - キー6 - 7値DataInputStreamの異常な動作

読み取るため

1 INT:私は7つの整数の合計を有するであろう三つの値を持つハッシュマップのためのだから

2つのコードが2つの異なる結果をもたらす可能性はありますか?唯一の違いは、最初の例では、補助変数を使用して、読み取るバイトの値を格納することです。 2番目の方法では、私はちょうどそれを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

ループが繰り返される前にループ全体が実行されます。 2番目の方法では、i < DIS.readInt();より前に実行され、それぞれの反復処理が行われ、DISから新しいintが読み込まれます。あなたの最初の方法は、一度だけ読んで値をキャッシュすることで、正しい方法です。

関連する問題