Почему смещение 0 при непрерывной записи в OutputStream не приводит к дублированным байтам?

#java #io #inputstream #outputstream

#java #io #inputstream #outputstream

Вопрос:

Я загружаю файл через http-запрос и считываю InputStream в a byte[] и записываю его byte[] в outputStream

 HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
InputStream is = conn.getInputStream();
int byteRead;         
buf = new byte[conn.getContentLength()];
while ((byteRead = is.read(buf)) != -1) {
       outStream.write(buf, 0, byteRead);
   } 
  

Допустим, мое byte[].length значение равно 16.
На первой итерации while inputStream записывает 4 байта [AAAA] в byte[] . Теперь у меня byte[] есть 4 байта, всего byte[].length 16. Это будет выглядеть так: [AAAA ---- ---- ----] . Теперь я записываю это в OutputStream. OutputStream теперь содержит [AAAA ---- ---- ----]

На второй итерации inputStream записывается еще 4 байта [BBBB] в byte[] . Мой byte[] теперь содержит 8 байтов : [AAAA BBBB ---- ----] . Если я запишу это byte[] в свой OutputStream со смещением 0 (начало byte[] ), не приведет ли это к удвоению первых 4 байтов следующим образом: [AAAA AAAA BBBB ----] ?

Ответ №1:

Ваша ошибка заключается в предположении, что внутри массива что-то отслеживает смещение, но это не так.

InputStream / OutputStream часто имеют неявное смещение (например, при записи в файл), а массивы — нет.

  • ваше первое чтение оставит ваши byte[] значения [AAAA ---- ---- ----] (при условии, что оно считывает 4 байта).
  • ваше второе чтение начнется с начала byte[] и оставит его как [BBBB ---- ---- ----]

Это даже представлено в вашем write вызове: второй аргумент указывает OutputStream , с какого индекса начинать чтение byte[] , и вы всегда указываете 0 (что правильно для такого рода циклов).