Вопрос: Как загрузить и сохранить файл из Интернета с помощью Scala?


В основном у меня есть URL / ссылка на текстовый файл в Интернете, и я пытаюсь загрузить его локально. По какой-то причине текстовый файл, который создается / загружен, пуст. Открыта для любых предложений. Благодаря!

    def downloadFile(token: String, fileToDownload: String) {

    val url = new URL("http://randomwebsite.com/docs?t=" + token + "&p=tsr%2F" + fileToDownload)
    val connection = url.openConnection().asInstanceOf[HttpURLConnection]
    connection.setRequestMethod("GET")
    val in: InputStream = connection.getInputStream
    val fileToDownloadAs = new java.io.File("src/test/resources/testingUpload1.txt")
    val out: OutputStream = new BufferedOutputStream(new FileOutputStream(fileToDownloadAs))
    val byteArray = Stream.continually(in.read).takeWhile(-1 !=).map(_.toByte).toArray
    out.write(byteArray)
    }

13


источник


Ответы:


Сбросьте буфер, а затем закройте выходной поток.


5



Я знаю, что это старый вопрос, но я просто натолкнулся на действительно хороший способ сделать это:

import sys.process._
import java.net.URL
import java.io.File

def fileDownloader(url: String, filename: String) = {
    new URL(url) #> new File(filename) !!
}

Надеюсь это поможет. Источник ,

Теперь вы можете просто использовать функцию fileDownloader для загрузки файлов.

fileDownloader("http://ir.dcs.gla.ac.uk/resources/linguistic_utils/stop_words", "stop-words-en.txt")

23



Вот наивная реализация scala.io.Source.fromURL а также java.io.FileWriter

def downloadFile(token: String, fileToDownload: String) {
  try {
    val src = scala.io.Source.fromURL("http://randomwebsite.com/docs?t=" + token + "&p=tsr%2F" + fileToDownload)
    val out = new java.io.FileWriter("src/test/resources/testingUpload1.txt")
    out.write(src.mkString)
    out.close
  } catch {
    case e: java.io.IOException => "error occured"
  }
}

Ваш код работает для меня ... Существуют и другие возможности, которые делают пустой файл.


8



Вот более безопасная альтернатива new URL(url) #> new File(filename) !!:

val url = new URL(urlOfFileToDownload)

val connection = url.openConnection().asInstanceOf[HttpURLConnection]
connection.setConnectTimeout(5000)
connection.setReadTimeout(5000)
connection.connect()

if (connection.getResponseCode >= 400)
  println("error")
else
  url #> new File(fileName) !!

Две вещи:

  • При загрузке с URL объект, если ошибка ( 404 например) возвращается, то URL объект будет бросать FileNotFoundException, И поскольку это исключение генерируется из другого потока (как URL происходит для отдельного потока), простой Try или try/catch не сможет поймать исключение. Таким образом предварительная проверка кода ответа : if (connection.getResponseCode >= 400),
  • Как следствие проверки кода ответа, соединение может иногда зависеть неограниченно открываться за неправильные страницы (как объясняется Вот ). Этого можно избежать установка таймаута в соединении : connection.setReadTimeout(5000),

1