Могу ли я изменить байты, которые запрашиваются для чтения, но не читаются в реальности InputStream?

В официальной документации 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) для временной обработки данных.

Первое, кажется, говорит, что только байты после остаются незатронутыми, второе, кажется, говорит, что байты после и до остаются незатронутыми. Второе предложение кажется расширенным вариантом первого. Что вы подразумеваете под словом «прикосновение»? Вы не должны касаться частных членов других классов.

knittl 06.03.2024 07:49

Первое цитируемое предложение описывает (сосредотачивается на том), что происходит с прочитанными байтами; второе предложение описывает, что происходит с незатронутыми байтами — оба являются частью спецификации; ни одного «недостаточно», и даже обоих вместе «недостаточно»; вообще, что ты имеешь в виду под "достаточно"? Достаточно для чего? -- ну, учитывая заголовок "байты, которые запрашиваются для чтения", второе цитируемое предложение не добавляет никакой соответствующей информации, предполагая, что от b[0] до b[off-1] не запрашиваются - возможно, пример действительно будет полезен :-/

user85421 06.03.2024 08:11

@knittl Я обновляю свой вопрос, описываю, чего я хочу, спасибо.

iseki 06.03.2024 11:16

Правильно, от b[off+k] до b[off+len-1] не будут изменены. Если бы вы думали, что их можно изменить, как вы думаете, на что они могли бы быть настроены?

k314159 06.03.2024 11:19

@user85421 user85421 Да, мой вопрос касается только того сегмента, который указан в первом абзаце. Часть, которая запросила чтение, но не выполнила действительные данные. Мой вопрос: что означает «незатронутый»? Могу ли я изменить его с помощью данных беспорядка?

iseki 06.03.2024 11:20

"незатронутый", насколько я понимаю, означает, что метод не будет изменять эти байты, то есть вы можете модифицировать эти "незатронутые" данные (до вызова и они не будут изменены после возврата вызова; например их не будет заполнено нулями)

user85421 06.03.2024 12:09
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
6
64
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Буфер b концептуально разделен на части:

  • от 0 до off-1: эти байты не затрагиваются (2. абзац)
  • от off до off+k-1: они содержат прочитанные байты (1 абзац)
  • от off+k до off+len-1: этот диапазон был включен в запрос на чтение, но не был изменен из-за недостаточности данных (1. абзац)
  • от off+len до off+b.length-1: эти байты не затрагиваются (2. абзац)

Между этими четырьмя диапазонами нет пересечения.

Да, это моя ошибка. Два абзаца описывают 2 части буфера. Я прочитал это неправильно. Я обновляю свой вопрос, описываю, чего я хочу, спасибо.

iseki 06.03.2024 11:14
Ответ принят как подходящий

Что касается InputStream.read(byte[] b, int off, int len), то возможны следующие сценарии:

  1. В потоке доступно len или более байт. В этом случае будут записаны байты от b[off] до b[off + len - 1]. Все остальные байты в буфере b не будут изменены.

  2. В потоке меньше len байт. Пусть k — общее количество байтов, которые можно прочитать. В этом случае будут записаны байты от b[off] до b[off + k - 1]. Все остальные байты в буфере b не будут изменены.

В частности, вашей реализации InputStream не разрешено сначала очищать содержимое b от off до off + len - 1 перед попыткой чтения потока.

Есть и другие возможные сценарии: те, которые связаны с исключениями. Эти сценарии выходят за рамки этого вопроса.

😫 Это значит, что мне нужен дополнительный буфер для временной обработки данных.

iseki 06.03.2024 11:37

@iseki, почему? Вам просто не нужно очищать эти байты перед их чтением. Если вы читаете только k вместо len байт, вы будете писать только k вместо len байт. Я не понимаю, в чем проблема.

k314159 06.03.2024 11:49

Я пишу строки. Я хочу реализовать resd(byte[],int,int), чтобы повысить производительность и избежать слишком большого количества вызовов чтения. Это означает, что до того, как я прочитаю весь буфер, я не знаю k.

iseki 06.03.2024 12:24

Вы можете улучшить производительность, используя BufferedInputStream. В любом случае, вам не нужно знать k, вам просто нужно попытаться записать до len байт в b, и если вместо этого вам удастся прочитать только k байт из потока, то вы запишете только k байт в b.

k314159 06.03.2024 12:29

Я просто хочу уменьшить вызов чтения. Даже это может быть оптимизировано JIT.

iseki 06.03.2024 13:15

Другие вопросы по теме