Зачем создавать байтовый массив в цикле и копировать его

Я не понимаю, зачем создавать байтовый массив в цикле и копировать его. Если я не создаю массив в цикле, код не будет работать. Пожалуйста, объясните мне

ObjectOutputStream outt = new ObjectOutputStream(socket.getOutputStream());
InputStream f=new FileInputStream(path);
byte[] buffer=new byte[10000];
int n;
while ((n=f.read(buffer))>0)
{
    byte[] tmpBuff = new byte[10000];
    System.arraycopy(buffer, 0, tmpBuff, 0, n);
    total_length += n;
    outt.writeObject(new MyObject(tmpBuff));
}
f.close();

1 ответ

Похоже, вы пишете в ObjectOutputStream, записывая блоки по 10000. Примечание: вы предполагаете, что ваш файл всегда кратен 10000 байт.

Когда вы пишете в ObjectOutputStream, он отслеживает любые объекты, которые он уже написал. Это означает, что если вы должны были написать buffer неоднократно, он отправит его только один раз. Один из обходных путей - взять копию, хотя clone() было бы проще.

Лучшее решение было бы либо

  • использование reset() на ObjectOutputStream, так что вы можете отправить один и тот же буфер более одного раза.
  • Вместо этого используйте DataOutputStream, поскольку вы переносите данные, а не объекты.
  • пишите только столько байтов, сколько вы прочитали. Таким образом, вы можете обрабатывать файлы, которые не кратны 10 000 байтов.
Другие вопросы по тегам