2016-09-11 2 views
1

소켓에서 읽을 때 클래스 DataInputStream을 사용하고 있습니다. 입력이 반드시 String 형식이 아니기 때문에 readByte (readLine 아님)를 사용해야합니다. 문제는 내가 함수를 호출하기 위해 스트림의 끝을 기다려야 만하고 그것을 발견 할 수 없다는 것입니다.DataInputStream 바이트의 끝 부분이 작동하지 않음 (Java)

코드 :

reader = new DataInputStream(socket.getInputStream()); 
byte dt;    

String cmd = ""; 
while((dt = reader.readByte()) >= 0){ 
    cmd += (char)dt; 

    if(/* end of the stream reached */){ 
     processInput(cmd); 
    } 
} 
System.out.println("End of the loop"); 

문제는 내가이 if을 작성하는 방법을 모르는 것입니다. 그리고 스트림이 끝났을 때 루프의 끝 부분에 도달하지 못했다는 증거는 "루프의 끝"이라는 문구가 인쇄되지 않으므로 루프에 막혀있는 것입니다.

답변

3

이것은 문서화되어 있습니다 readByte()에서

예외 :
예외 : EOFException를 - 입력 스트림 끝에 도달 한 경우.

그래서 파일의 끝을보기 위해, 당신은 또 다른이의 끝에 도달 할 때 -1을 반환 read() 기능 중 하나를 사용하는 것입니다 try/catch

try { 
    while(true){ 
     cmd += (char) reader.readByte(); 
    } 
} catch (EOFException e) { 
    // handle EOF 
} 

/* end of the stream reached */ 
processInput(cmd); 

System.out.println("End of the loop"); 

를 사용해야합니다 파일, 예. 그들은 입력의 전체 버퍼를 반환하기 때문에,보다 효율적으로 할 수있는 다른 read(...) 기능 중 하나를 사용

int dt; 
while ((dt = reader.read()) >= 0) { 
// ... 
} 

.

+0

아무도 작동하지 않았습니다. 프로그램의 행동은 같은 방식으로 ... – Fabiotk

+1

해야합니다. 소켓의 다른 쪽 끝이 닫혀 있습니까? – bal