Как рассчитать 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.

Другие вопросы по тегам