scalaj-http - метод 'execute' возвращает "поток закрыт"

Я хочу использовать библиотеку scalaj-http для загрузки файла байтового содержимого размером 31 ГБ из HTTP-соединения. asBytes - не вариант, потому что он возвращает массив байтов.

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

Что я делаю не так?

  val response: HttpResponse[InputStream] = Http(url).postForm(parameters).execute(inputStream => inputStream)

  if (response.isError) println(s"Sorry, error found: ${response.code}")
  else {
    val is: InputStream = response.body
    val buffer: Array[Byte] = Array.ofDim[Byte](1024)
    val fos = new FileOutputStream("xxx")
    var read: Int = 0

    while (read >= 0) {
      read = is.read(buffer)
      if (read > 0) {
        fos.write(buffer, 0, read)
      }
    }
    fos.close()
  }

1 ответ

You cannot export the inputStream as the stream will be closed at the end of the execute method. You should use the stream inside the execute, like this :

        val response = Http(url).postForm(parameters).execute { is =>         
    val buffer: Array[Byte] = Array.ofDim[Byte](1024)
    val fos = new FileOutputStream("xxx")
    var read: Int = 0

    while (read >= 0) {
      read = is.read(buffer)
      if (read > 0) {
        fos.write(buffer, 0, read)
      }
    }
    fos.close()
  }

  if (response.isError) println(s"Sorry, error found: ${response.code}")
Другие вопросы по тегам