Как рассчитать byteCount в методе чтения InputStream
Я хочу скачать файл через InputStream из какого-то offSet, я знаю, что могу сделать это методом чтения InputStream, но для этого требуется параметр byteCount, но я не знаю, как рассчитать byteCount для метода чтения
Мой код
try {
URL url;
url = new URL(uri);
HttpURLConnection c = (HttpURLConnection) url
.openConnection();
c.setConnectTimeout(1000000);
c.connect();
int lenghtOfFile = c.getContentLength();
Log.i("fileSize", lenghtOfFile + "");
File file = new File(
Environment.getExternalStorageDirectory() + "/"
+ Environment.DIRECTORY_DOWNLOADS);
file.mkdirs();
File outputFile = new File(file, "4k1.jpg");
FileOutputStream fos = new FileOutputStream(outputFile);
Log.v("Place", "trying...");
InputStream is = c.getInputStream();
Log.v("errorPart", c.getURL().toString());
if (c.getURL().toString().contains("404"))
Log.v("Error", "404 Error");
Log.v("Place", "1st attempt success");
byte[] buffer = new byte[1024];
int len1 = 0;
Log.v("Place", "Download started!");
int on = 0;
while ((len1 = is.read(buffer)) != -1) {
fos.write(buffer, 0, len1);
Log.v("is", "running " + len1);
}
Log.v("Place", "Download Finished!");
fos.close();
is.close();
} catch (Exception e) {
e.printStackTrace();
}
Пожалуйста, попробуйте объяснить ваш ответ, я новичок
4 ответа
Вы должны указать, сколько байтов он может прочитать. Это сделано для того, чтобы метод read() не копировал данные в память, чего не следует делать. Поэтому вы должны передать размер buffer
, В приведенном выше коде это будет 1024. Вы можете использовать private static int BUFFER_SIZE = 1024
и использовать эту константу как в new
а также read()
так что если вы измените размер буфера, вы не забудете изменить параметр на read()
функция также.
private static final int BUFFER_SIZE = 1024;
...
byte[] buffer = new byte[BUFFER_SIZE];
int len1 = 0;
Log.v("Place", "Download started!");
int on = 0;
while ((len1 = is.read(buffer,0,BUFFER_SIZE)) != -1) {
fos.write(buffer, 0, len1);
Log.v("is", "running " + len1);
}
...
Почему бы не использовать класс напрямую? CountingInputStream
, предоставленный Apache. Этот класс был идеально разработан в соответствии с вашими требованиями.
Прямой доступ к размеру файла из HttpURLConnection отсутствует. Вы можете использовать кэш-память nio в своем файловом потоке в одноразовом сгенерированном файле.
Вам не нужно предоставлять byteCount для метода чтения. С помощью is.read(buffer))
будет просто считывать 1024 байта (так как определяется длиной вашего буферного массива) в каждом раунде, пока не будет возвращено -1.