2012-11-27 4 views
3

В проекте OpenJDK7 java.nio.file.Files существует следующая функция. Мой вопрос в том, должен ли условие while 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 функции говорит, что прочту все байты из входного поток. Если он находится в плохом соединении, и следующий байт не может быть немедленно доступен, цикл while завершится, прежде чем извлекать все байты. Разве это не так? – tanyehzheng

+0

@tanyehzheng Это неверно. Javadocs для ['InputStream.read'] (http://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html#read (byte [])) говорят, что хотя бы один байт будет возвращен, иначе он будет заблокирован. Если первый байт не может быть прочитан по какой-либо причине, кроме EOF, тогда он выдает «IOException». Любой поток, который возвращает 0 для этой функции, неправильно написан и не подклассифицирует 'InputStream' должным образом. (За исключением случаев, когда буфер представляет собой массив нулевой длины, то есть.) – Brian

1

Является ли это ошибкой или нет, зависит от цели функции.

Обычно это будет работать точно так, как вы ожидаете, так как вызов read будет блокироваться, пока не станет доступен по крайней мере один байт данных. Однако, если входной поток не блокируется, вызов read будет возвращать 0, если в настоящее время больше недоступных данных. Это состояние отличается от активно закрытого потока.

Другими словами, можно утверждать, что это ошибка или нет, в зависимости от того, что вы ожидаете от нее, когда сталкиваетесь с неблокирующим потоком, который не имеет данных, доступных в момент вызова метода.

+0

, если условие изменено на> = 0, то, независимо от того, он в режиме блокировки или неблокирования, он будет работать, как ожидалось. Не так ли? – tanyehzheng

+0

Это зависит от того, чего вы ожидаете. Вы хотите, чтобы он блокировался, когда больше нет данных? Кроме того, если вы это сделаете, и поток не блокируется, вы в конечном итоге будете потреблять 100% процессор, ожидая следующего байта данных. Это не очень хорошо. –

1

То же самое, потому что InputStream.read(byte[]) здесь не вернет 0. Из Javadoc

по крайней мере один байт читается

Смежные вопросы