2016-11-26 4 views
0

Je voudrais construire un hashmap à partir d'un fichier binaire. Ce fichier binaire a la structure suivante: le premier entier indique le nombre d'entiers que je dois lire dans le flux afin de construire le hashmap suivi par les paires clé/valeur.Comportement étrange de DataInputStream

Donc, pour un hashmap avec trois valeurs j'avoir un total de 7 entiers:

1 int à lire - clé 2 - 3 valeur - touche 4 - 5 valeur - clé 6 - 7 valeur

Comment est-il possible que les deux codes suivants aient deux résultats différents? La seule différence est que dans le premier exemple j'utilise une variable auxiliaire un pour stocker la valeur des octets à lire. Dans le second, je l'utilise directement dans la boucle 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; 
} 

Ce code est sans variable auxiliaire:

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; 
} 

Les travaux antérieurs mieux que celui-ci, mais il est toujours incompatible avec la structure que je me attends.

Je ne sais pas si c'est pertinent mais mon implémentation utilise le multi-thread, mais chaque thread a son propre DataInputStream.

+0

En ce qui concerne votre thread avec chaque thread ayant son propre 'DataInputStream', chacun d'eux lit-il aussi son propre fichier? – Kayaman

+0

oui, chaque thread a son propre fichier – Aalto

Répondre

3

L'état complet d'une boucle for est exécuté avant chaque itération. Dans votre deuxième méthode, i < DIS.readInt(); s'exécute avant chaque itération, en lisant un nouveau int de DIS. Votre première méthode le fait correctement, en ne lisant qu'une seule fois et en mettant en cache la valeur.