Я использую Java 8, пишу простой клиент и сервер, чтобы убедиться, что использование Zero copy
более эффективно, чем традиционный подход из статьи . Но я столкнулся с одной проблемой: на стороне сервера метод InputStream.reamd(byte[],int postion,int length)
всегда возвращает length
, даже если последнее чтение из InputStream не имеет достаточных данных.
код вроде этого 100
while (true) {
Socket socket = serverSocket.accept();
inputStream = socket.getInputStream();
byte[] readBuf = new byte[4096];
long sum = 0L;
while (true) {
int readN = inputStream.read(readBuf, 0, 4096);
System.out.println("read from buffer " + readN);
if (-1 == readN) {
break;
}
sum += readN;
}
System.out.println("total receive " + sum + " bytes");
}
Последние два вывода:
read from buffer 4096
read from buffer -1
Выходной результат:
read from buffer 3440
read from buffer -1
В документе Java говорится:
public int read (byte [] b,
Int off,
инт лен)
выдает IOException
Считывает до байтов данных из входного потока в массив байтов. Предпринята попытка прочитать столько же, сколько и байтов, но можно прочитать меньшее число. Количество фактически прочитанных байтов возвращается как целое число.
Почему поведение кода не соответствует документу?