2013-07-10 4 views
2

java.io.EOFException이 나타나는 이유를 알 수 없습니다. 내가 서버에서 이진 스트림을 얻은 후에 파일을 작성하고 싶습니다.소켓에서 읽을 때 java.io.EOFException

여기 내 코드의

inputStream = new DataInputStream(new BufferedInputStream(connection.getInputStream())); 
FileOutputStream fos = new FileOutputStream("D:/Apendo API resumable download.txt"); 

byte b = inputStream.readByte(); 
while(b != -1){ 
     fos.write(b); 
     b = inputStream.readByte();      
     } 
fos.close(); 

스택 추적

java.io.EOFException 
at java.io.DataInputStream.readByte(DataInputStream.java:267) 
at HttpRequestJSON.JSONRequest.sendRequest(JSONRequest.java:64) 
at HttpRequestJSON.Main.main(Main.java:56) 
+0

어디에서 예외가 있습니까? –

+0

b = inputStream.readByte(); in (b! = -1) – Yusuf1494

+0

Err, 실제로 파일을 * 읽으려고 할 때. – EJP

답변

8

DataInputStream.readByte의 API가 반환 -1 EOS에 말을하지 않습니다, 그것은

반환을 말한다 다음은 부호 없음 8 비트 바이트로서이 입력 스트림의 다음의 바이트

오류 : EOFException - 입력 스트림의 끝에 도달 한 경우.

DataInputStream.readByte로 작업 할 때 스트림에 남은 바이트 수를 알고 있다고 가정합니다. 그렇지 않으면 EOS의 지시자로 EOFException을 사용할 수 있습니다.

읽고 사용하십시오 BTW 경우() 당신은 얻을 것이다 -1 EOS에 EOFException는

없이 DataInputStream Javadoc에서
+0

그래서 EOFException이 나타나면 DataInputStream이 byte를 쓰는 것을 의미합니까? – Yusuf1494

+1

예, 더 이상 바이트가 아니라 스트림 EOS의 끝을 의미합니다. BTW read()를 사용하면 EOFException없이 -1이됩니다. –

+0

감사합니다. 고마워 Evgeniy Dorofeev :) – Yusuf1494

1

:

데이터 입력 스트림을 기초의 입력에서 원시적 형의 Java 데이터를 응용 프로그램 읽을 수 스트림을 컴퓨터 독립적 인 방식으로 재생합니다.

내가 필요한지 확실하지 않지만 직접 결정할 수 있습니다. 일반적으로 데이터를 다운로드하고 파일에 쓰는 경우에는 필요하지 않습니다. 단지 BufferedInputStream을 고수하십시오.

readByte() 메서드는 1 바이트 (따라서 이름)를 읽고 모든 바이트를 읽기 전에 스트림이 끝에 도달하면 EOFException을 반환합니다. 약간 혼란 스러울 지 모르지만 파일을 쓰지 않고 입력을 읽는 예외가 발생합니다. 사실 DataInputStream이 종료되었는지 여부를 확인하는 유일한 방법입니다.

하지만 아마도 다시 BufferedInputStream 만 사용하는 것이 좋습니다.

0

이미 바이트를 읽은 다음 왜 다시 읽는 중입니까? 플러스 당신의 수표가 정확하지 않으면, 당신은 -1을 얻지 못합니다 DIS.readByte. read()를 사용해보십시오.

0

클라이언트 - 서버 구현을 사용할 때 클라이언트가 "항상 켜져"있고 소켓이 전체 시간을 유지하는 경우에 따라 다릅니다.

예를 들어 ObjectInputStream을 사용하면 socket.close()가 true 일 때 클라이언트 닫기 소켓 (socket.close) 또는 "java.net.SocketException : Connection"재설정이 수행 될 때 "EOFException"이 표시됩니다. 마침내 확인하십시오 ...

하지만 클라이언트와 소켓 연결을 유지하면 ObjectInputStream.readObject()가 계속 남아있어이 시나리오에서 원하는 것을들을 수 있습니다. 그리고 예를 들어 read() 만 호출하면 -1이 반환되고 클라이언트가 죽고 클라이언트 하나의 스레드 만 서버에서 처리하면 -1 만 얻고 스레드는 영구적으로 생깁니다. 전체 서버)

관련 문제