Зачем создавать байтовый массив в цикле и копировать его
Я не понимаю, зачем создавать байтовый массив в цикле и копировать его. Если я не создаю массив в цикле, код не будет работать. Пожалуйста, объясните мне
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 байтов.