2016-11-26 1 views
0

이진 파일에서 해시 맵을 작성하고 싶습니다. 이 바이너리 파일의 구조는 다음과 같습니다. 첫 번째 정수는 해시 맵과 키/값 쌍을 작성하기 위해 스트림에서 읽어야하는 정수의 수를 나타냅니다. 키 2 - 3 - 값 4 - 키 - 5 값 - 6 - 키 7 값DataInputStream 이상한 동작

읽을

1 INT : I 7 개 정수 총했을 세 값을 갖는 해시 맵 이처럼

두 개의 코드가 서로 다른 결과를 갖는 것은 어떻게 가능합니까? 유일한 차이점은 첫 번째 예제에서 보조 변수 을 사용하여을 읽을 바이트 값을 저장한다는 것입니다. 두 번째 예제에서는 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을 읽습니다. 첫 번째 방법은 값을 캐싱하고 한 번만 읽음으로써 올바른 방식으로 수행합니다.