2012-11-27 2 views
3

OpenJDK7 프로젝트 java.nio.file.Files에는 다음과 같은 기능이 있습니다. 내 질문은 while 루프 조건>> = 대신해야합니까? source.read의 javadoc가 EOF에 도달했을 때, 그것은 돌아갑니다 -1 당신은 잘못 읽기 기능을 찾고 있습니다 0이 아닌JDK7 Files.copy

/** 
* Reads all bytes from an input stream and writes them to an output stream. 
*/ 
private static long copy(InputStream source, OutputStream sink) 
    throws IOException 
{ 
    long nread = 0L; 
    byte[] buf = new byte[BUFFER_SIZE]; 
    int n; 
    while ((n = source.read(buf)) > 0) { 
     sink.write(buf, 0, n); 
     nread += n; 
    } 
    return nread; 
} 

답변

1

있다고 때문이다. 바이트 배열을 사용하는 InputStream의 읽기 기능은 버퍼에 복사 된 바이트 수를 반환합니다. 따라서 얼마나 많은 바이트를 복사 할 수 있는지 알 수 있습니다.

* @return  the total number of bytes read into the buffer, or 
*    <code>-1</code> if there is no more data because the end of 
*    the stream has been reached. 

따라서 두 가지 경우를 모두 충족합니다. 스트림 끝이 (-1)에 도달했거나 다른 이유로 버퍼에 읽지 않은 바이트입니다.

+0

함수의 javadoc의 읽기의 javadoc에서 0을 반환하지 않기 때문에 그것이 입력에서 모든 바이트를 읽어 줄 테니 말한다 흐름. 연결 상태가 좋지 않고 다음 바이트를 즉시 사용할 수없는 경우 모든 바이트를 반입하기 전에 while 루프가 종료됩니다. 그렇지 않니? – tanyehzheng

+0

@tanyehzheng 그건 잘못되었습니다. ['InputStream.read'] (http://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html#read (byte []))에 대한 javadocs는 적어도 하나의 바이트 그렇지 않으면 블록됩니다. 첫 번째 바이트가 EOF 외의 이유로 읽을 수없는 경우 'IOException'을 발생시킵니다. 이 함수에 대해 0을 리턴하는 스트림은 모두 잘못 쓰여지고'InputStream'의 서브 클래스를 적절하게하지 않습니다. (버퍼가 길이가 0 인 배열을 제외하면.) – Brian

1

버그인지 여부는 기능의 의도에 따라 다릅니다.

보통 적어도 1 바이트의 데이터를 사용할 수있을 때까지 read을 호출하면 예상대로 작동합니다. 그러나 입력 스트림이 비 블로킹이면 read 호출은 이 현재 데이터가 더 이상 없을 때 0을 반환합니다. 이 상태는 활발히 닫히고있는 스트림과 다릅니다.

즉, 메서드가 호출 될 때 사용할 수있는 데이터가없는 비 차단 스트림에 직면했을 때 기대하는 바에 따라 이것이 버그인지 아닌지를 알 수 있습니다. 같은

+0

조건이> = 0으로 변경되면 블로킹 모드 또는 비 블로킹 모드에 관계없이 예상대로 작동합니다. 그렇지 않니? – tanyehzheng

+0

그것은 당신이 기대하는 것에 달려 있습니다. 더 이상 사용할 수있는 데이터가 없을 때 차단 하시겠습니까? 또한 스트림을 비 블로킹하면 데이터의 다음 바이트를 기다리는 동안 100 % CPU를 소비하게됩니다. 그건별로 좋지 않아. –

1

, 여기 InputStream.read(byte[])

1 바이트 이상이

관련 문제