2014-10-17 3 views
2

이 내용을 바탕으로 나는 question을 다음과 같이 질문합니다. 가정 I/O를 차단하고 나는 다음과 같은 코드 조각이 :이 코드는 읽고 몇 바이트를 가지고 때까지 read 호출에 차단하는 것입니다가용 및 읽음 : 블로킹 Java 입출력을 사용하면서 실제로 비 블로킹이 가능합니까?

byte[] data = new byte[10]; 
someInputStream.read(data) 

합니다. 나는 read이 실제로 더 적은 바이트를 읽을 수도 있고 읽은 바이트 수가 read 메소드에 의해 리턴 될 것임을 잘 알고 있습니다.

내 질문은 여기 있습니다. 나는이 가정

byte[] data = new byte[10]; 
if (someInputeStream.available() >= 10) { 
     someInputStream.read(data); // *** 
} 

*** 라인은 차단하지 보장되어 있습니까? 다시 말하지만,이 읽기가 여전히 10 바이트 미만일 수 있음을 알고 있습니다.

답변

1

차단하지 않을 것입니다.

중 다음의 호출에 의해 차단되지 않고 입력 스트림으로부터 판독 (또는 스킵) 될 수있는 바이트의 수를 리턴 다음 available() 방법 찾고 InputStream 대한 Javadoc 가입일

, 이 입력 스트림의 메소드 다음 번 호출은 동일한 스레드 또는 다른 스레드 일 수 있습니다. 이 많은 바이트의 단일 읽기 또는 건너 뛰기는 차단되지 않지만 더 적은 바이트를 읽거나 건너 뛸 수 있습니다.

(강조 광산.) (당신이 말한대로)

그래서 그것을 차단하지만,하지 않습니다 당신은 전체 10 바이트를 얻을 수 있습니다.

이것은 단일 스레드라고 가정합니다. 여러 스레드가있는 경우 물론 다른 스레드가 available()read() 사이의 스트림에서 읽었을 수 있습니다.