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