В официальной документации JDK java.io.InputStream#read(byte[], int, int) сказано:
Пусть k — количество фактически прочитанных байтов; эти байты будут храниться в элементах от b[off] до b[off+k-1], оставляя элементы от b[off+k] до b[off+len-1] незатронутыми.
Но после предложения в следующем абзаце говорилось:
В любом случае элементы от b[0] до b[off-1] и элементы от b[off+len] до b[b.length-1] не затрагиваются.
Первое предложение требует более сильного ограничения операции чтения.
Я пишу реализацию, которая расширяется от InputStream. В документации сказано: «не затронуто». Я интерпретирую это как то, что его нельзя изменить во время операции чтения. Но даже для b[off+k]~b[off+len-1] тоже нельзя изменить? Я хочу использовать весь буфер [off, off+len) для временной обработки данных.
Первое цитируемое предложение описывает (сосредотачивается на том), что происходит с прочитанными байтами; второе предложение описывает, что происходит с незатронутыми байтами — оба являются частью спецификации; ни одного «недостаточно», и даже обоих вместе «недостаточно»; вообще, что ты имеешь в виду под "достаточно"? Достаточно для чего? -- ну, учитывая заголовок "байты, которые запрашиваются для чтения", второе цитируемое предложение не добавляет никакой соответствующей информации, предполагая, что от b[0] до b[off-1] не запрашиваются - возможно, пример действительно будет полезен :-/
@knittl Я обновляю свой вопрос, описываю, чего я хочу, спасибо.
Правильно, от b[off+k] до b[off+len-1] не будут изменены. Если бы вы думали, что их можно изменить, как вы думаете, на что они могли бы быть настроены?
@user85421 user85421 Да, мой вопрос касается только того сегмента, который указан в первом абзаце. Часть, которая запросила чтение, но не выполнила действительные данные. Мой вопрос: что означает «незатронутый»? Могу ли я изменить его с помощью данных беспорядка?
"незатронутый", насколько я понимаю, означает, что метод не будет изменять эти байты, то есть вы можете модифицировать эти "незатронутые" данные (до вызова и они не будут изменены после возврата вызова; например их не будет заполнено нулями)




Буфер b концептуально разделен на части:
0 до off-1: эти байты не затрагиваются (2. абзац)off до off+k-1: они содержат прочитанные байты (1 абзац)off+k до off+len-1: этот диапазон был включен в запрос на чтение, но не был изменен из-за недостаточности данных (1. абзац)off+len до off+b.length-1: эти байты не затрагиваются (2. абзац)Между этими четырьмя диапазонами нет пересечения.
Да, это моя ошибка. Два абзаца описывают 2 части буфера. Я прочитал это неправильно. Я обновляю свой вопрос, описываю, чего я хочу, спасибо.
Что касается InputStream.read(byte[] b, int off, int len), то возможны следующие сценарии:
В потоке доступно len или более байт. В этом случае будут записаны байты от b[off] до b[off + len - 1]. Все остальные байты в буфере b не будут изменены.
В потоке меньше len байт. Пусть k — общее количество байтов, которые можно прочитать. В этом случае будут записаны байты от b[off] до b[off + k - 1]. Все остальные байты в буфере b не будут изменены.
В частности, вашей реализации InputStream не разрешено сначала очищать содержимое b от off до off + len - 1 перед попыткой чтения потока.
Есть и другие возможные сценарии: те, которые связаны с исключениями. Эти сценарии выходят за рамки этого вопроса.
😫 Это значит, что мне нужен дополнительный буфер для временной обработки данных.
@iseki, почему? Вам просто не нужно очищать эти байты перед их чтением. Если вы читаете только k вместо len байт, вы будете писать только k вместо len байт. Я не понимаю, в чем проблема.
Я пишу строки. Я хочу реализовать resd(byte[],int,int), чтобы повысить производительность и избежать слишком большого количества вызовов чтения. Это означает, что до того, как я прочитаю весь буфер, я не знаю k.
Вы можете улучшить производительность, используя BufferedInputStream. В любом случае, вам не нужно знать k, вам просто нужно попытаться записать до len байт в b, и если вместо этого вам удастся прочитать только k байт из потока, то вы запишете только k байт в b.
Я просто хочу уменьшить вызов чтения. Даже это может быть оптимизировано JIT.
Первое, кажется, говорит, что только байты после остаются незатронутыми, второе, кажется, говорит, что байты после и до остаются незатронутыми. Второе предложение кажется расширенным вариантом первого. Что вы подразумеваете под словом «прикосновение»? Вы не должны касаться частных членов других классов.