Сокет InputStream.read (byte [], int, int) всегда возвращает значение третьего параметра - PullRequest
0 голосов
/ 13 января 2019

Я использую 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

Считывает до байтов данных из входного потока в массив байтов. Предпринята попытка прочитать столько же, сколько и байтов, но можно прочитать меньшее число. Количество фактически прочитанных байтов возвращается как целое число.

Почему поведение кода не соответствует документу?

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