基本上我有一个在线文本文件的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)
}
答案 0 :(得分:27)
我知道这是一个老问题,但我刚刚遇到了一个非常好的方法:
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")
答案 1 :(得分:9)
以下是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"
}
}
您的代码对我有用......还有其他可能会生成空文件。
答案 2 :(得分:5)
刷新缓冲区,然后关闭输出流。
答案 3 :(得分: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
恰好在单独的线程上运行),所以简单的Try
或try/catch
将无法捕获该异常。因此,响应代码的初步检查:if (connection.getResponseCode >= 400)
。connection.setReadTimeout(5000)
来避免。