inputStream.read не работает правильно - PullRequest
0 голосов
/ 01 мая 2018

yЯ использую следующий код для загрузки файла из интернета.

//suppose I call this method inside main(String[] st) method.
private void download(String link){
  URL url = new URL(link);
  HttpURLConnection connection = (HttpURLConnection) url.openConnection();
  connection.setRequestProperty("Accept-Encoding", "identity");
  connection.setRequestProperty("connection", "close");
  connection.connect();
  save(connection.getInputStream());
}

private final int DOWNLOAD_BUFFER_SIZE = 10 * 1024;
  private void save(InputStream inputStream) {
    FileOutputStream fos;
    try {
      byte[] buffer = new byte[DOWNLOAD_BUFFER_SIZE];
      int len;
      fos = new FileOutputStream("FILE_PATH");
      while ((len = inputStream.read(buffer)) != -1) {
        fos.write(buffer, 0, len);
      }
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      //close streams, flush, etc.
    }
  }

Все в порядке и код работает нормально. Но когда я изменяю значение DOWNLOAD_BUFFER_SIZE на маленькие числа, такие как 5, происходит странная вещь! Когда я изменяю значение DOWNLOAD_BUFFER_SIZE на маленькие цифры и отключаю интернет-соединение, загрузка продолжается некоторое время и не останавливается! Но когда значение DOWNLOAD_BUFFER_SIZE большое, как 10 * 1024, все в порядке, и когда я отключаю, загрузка моего соединения останавливается.

Кто-нибудь может мне помочь? Я хочу, чтобы моя загрузка была остановлена, когда значение DOWNLOAD_BUFFER_SIZE мало, и я отключаю свое интернет-соединение.

Я видел эту ссылку, но это не помогло.

ответ EJP не содержит решения для решения этой проблемы. Я хочу, чтобы DOWNLOAD_BUFFER_SIZE был маленьким по ряду причин.

Пожалуйста, помогите мне. Мне нужна ваша помощь. пожалуйста: X

Заранее извиняюсь, если грамматика моего предложения неверна. потому что я плохо говорю по-английски.

1 Ответ

0 голосов
/ 01 мая 2018

Из-за буфера приема сокета. В нем так много всего. Если вы читаете небольшие куски из него, это займет больше чтения.

Я не знаю, почему вы хотите, чтобы размер буфера загрузки был маленьким. Я обычно использую 4096 или 8192 байта. Установка такого большого значения, как 1 МБ, не имеет смысла, если только буфер приема сокета в ядре не будет одинаково большим.

Если вас беспокоят сетевые сбои, как и должно быть, вы должны установить таймаут чтения на сокете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...