#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 (что правильно для такого рода циклов).