Метод read(byte[])
в потоках Java может считывать меньше байтов, чем запрошено.
По файлу в интернете Полагаю, вы имеете в виду содержимое HTTP-URL.
Некоторые ответы HTTP не дают заранее Content-Length, что также не позволяет предварительно выделить массив байтов правильного размера, как вы, похоже, делаете.
Возможно, вам будет интересно узнать, что доступная на Android клиентская библиотека Apache http уже предоставляет вспомогательный метод EntityUtils.toByteArray()
, который полностью выбирает содержимое URL-адреса и возвращает его в виде байтового массива правильного размера.
Вот фрагмент кода, использующего его:
public byte[] fetchURL(String url) throws IOException, ClientProtocolException {
HttpClient httpclient = new DefaultHttpClient();
HttpGet httpget = new HttpGet(url);
HttpResponse response = httpclient.execute(httpget);
HttpEntity entity = response.getEntity();
return EntityUtils.toByteArray(entity);
}
Обратите внимание, что чтение всего ответа в памяти не всегда является лучшим решением. Может быть предпочтительным сообщить пользователю о ходе загрузки или проанализировать большой документ постепенно. На самом деле ответ может даже не помещаться в ОЗУ (например, большой видеопоток).