【问题标题】:How to download and save a file from the internet using Scala?如何使用 Scala 从 Internet 下载和保存文件?
【发布时间】:2020-02-28 20:08:23
【问题描述】:

基本上我有一个在线文本文件的 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)
    }

【问题讨论】:

    标签: scala download


    【解决方案1】:

    我知道这是一个老问题,但我只是遇到了一个非常好的方法:

    import sys.process._
    import java.net.URL
    import java.io.File
    
    def fileDownloader(url: String, filename: String) = {
        new URL(url) #> new File(filename) !!
    }
    

    希望这会有所帮助。 Source.

    您现在可以简单地使用 fileDownloader 函数来下载文件。

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

    【讨论】:

    • 如果我想使用上面相同的代码,而不是在本地下载和存储它,我想将它存储在我知道 IP 的不同服务器中
    • 感谢您添加导入!
    • @Aamir 取决于其他服务器如何处理上传。在这种情况下,您将无法使用上述方法。
    • 此外,当文件不可用时,似乎无法捕获异常。
    • @user833970,你总是可以把整个东西包在scala.util.Try中。
    【解决方案2】:

    这是scala.io.Source.fromURLjava.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"
      }
    }
    

    您的代码对我有用...还有其他可能导致空文件。

    【讨论】:

    • 尝试了另一个链接,它可以工作,叹息,我正在尝试的网址有问题。谢谢!
    • 但是如果文件是二进制格式,那我猜src.mkString可能会失败...
    【解决方案3】:

    这里是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 恰好在一个单独的线程上运行),一个简单的Trytry/catch 将无法捕获该异常。因此响应代码的初步检查if (connection.getResponseCode >= 400)
    • 作为检查响应代码的结果,连接有时可能会因为不正确的页面而无限期打开(如here 所解释)。这可以通过设置连接超时来避免:connection.setReadTimeout(5000)

    【讨论】:

    • 最后一行是否打开了第二个连接?
    【解决方案4】:

    刷新缓冲区,然后关闭输出流。

    【讨论】:

      猜你喜欢
      • 2010-10-29
      • 1970-01-01
      • 2016-12-23
      • 2012-07-05
      • 1970-01-01
      • 2012-08-03
      • 2016-10-03
      • 1970-01-01
      相关资源
      最近更新 更多