2013-12-18 4 views
5

나는 항상 궁금해했다 : 스트림의 끝은 무엇인가?입/출력 스트림 : 스트림 끝?

java.io 패키지의 대부분의 readLine 메소드의 javadoc에서 "스트림의 끝에 도달하면 null을 반환합니다"라고 읽을 수 있습니다. 실제로는 null이 아니지만 대부분의 스트림 (내가 가장 자주 사용하는 네트워크 스트림의 경우) 무엇인가가 원격 장치의 스트림에 기록 될 때까지 프로그램 실행을 차단하십시오.

실제 예외가 아닌 예외적 인 방식으로이 acutal 동작을 적용하는 방법이 있습니까? 나는 단지 호기심이 ...

+0

FileInputStream을 사용하여 파일을 읽습니다. –

+0

정확히 어떤 행동을 시행합니까? 다른 프로그램이있을 때까지 프로그램을 차단 하시겠습니까? –

+0

readLine()을 사용하여 네트워크 스트림에서 읽을 때 Reader가 null을 반환하도록합니다. – salbeira

답변

8

파일을 읽는다고 생각하십시오. 파일의 끝 부분에 스트림의 끝이 있습니다. 그 이상으로 읽으 려한다면, 그렇게 할 수 없습니다. 네트워크에 연결되어 있다면 더 많은 데이터가 전송 될 때까지 기다리지 않고도 스트림이 끝날 필요는 없습니다.

파일의 경우 읽을 데이터가 더 이상 없다는 것을 알고 있습니다. 네트워크 스트림의 경우 우리는 (보통)하지 않습니다. 이 때 FileReader 데이터가 더 이상 사용할 수없는, 각성을 차단

: 간단한 대답은 : 당신이 수 없습니다. 근본적인 차이점은 파일을 적극적으로 읽는 것이지만 네트워크 스트림을 청취 할 때 수동적으로 읽는 것입니다. 네트워크에서 뭔가가 나오면 하드웨어가 신호를 운영체제로 보내고, 그러면 운영 체제가 새 데이터를 JVM에 제공하고 JVM은 프로세스를 깨우고 새로운 데이터를 읽습니다. 그러나 우리는 파일을 가지고 있지 않습니다. 적어도 즉시는 아닙니다.

가능한 해결 방법은 사용자가 가지고있는 StreamReader에 대한 래퍼를 만드는 것입니다. 파일을 변경할 때 알림이 수신되면 사용자가 더 읽을 수 있습니다. Java 7에서는 WatchService을 사용할 수 있습니다.

+0

실제로 원격 장치의 소켓을 닫음으로써 null을 반환하는 독자를 얻게되었습니다. 분명히 스트림이 종료되었지만 문자 그대로 끝났다는 것을 알려주는 표시기가 설정되어 있습니다 (데이터를 수신하기 위해) ... 이것은 원격 종료가 연결을 닫을 때 정리 코드를 삽입하기 위해 기다린 순간입니다! – salbeira

+0

['configureBlocking'] (http://docs.oracle.com/javase/7/docs/api/java/nio/channels/spi/AbstractSelectableChannel.html#configureBlocking (boolean)) 및 ['available' ] (http://docs.oracle.com/javase/7/docs/api/java/io/InputStream).html # available()) –

0

어떤 시점에서 소켓이 닫히고 더 이상 스트림을 통해 데이터를 보낼 수 없습니다. 이것은 이 read()에서 -1을 반환하고 EOF를 알리는 신호입니다. 이 상태는 되돌릴 수 없습니다. 그 시냇물은 죽었어.

열린 스트림에서 더 많은 데이터를 차단하는 것은 EOF 조건이 아닙니다.

+0

EOF와 EOS (tream)의 정확한 차이점은 무엇입니까? - "문자 코드"와 같은 대답도 유효합니다. – salbeira

+0

@salbeira 차이점이 없으며 스트림을 통해 실제로 전송되는 데이터가 없습니다 (또는 파일에서 읽음). 이 결과는'InputStream' 구현 클래스에 의해 생성됩니다. 그것은 로직의 결과이며 대역 내 신호가 아닙니다. – erickson

1

나는 실제로 뭔가가 원격 끝

에 스트림에 기록 될 때까지 그냥 프로그램 실행을 차단 (내가 가장 자주 사용하는 네트워크 스트림의 경우) 대부분의 스트림으로 널을 가진 적이 없어

아니요. 피어가 연결을 종료하지 않았으므로 절대 null이 표시되지 않습니다. 그것이 '스트림의 끝'이 의미하는 것입니다. '당분간 더 이상 데이터가 없다'는 의미는 아닙니다.

관련 문제