开发者

File download problem in my scala code

开发者 https://www.devze.com 2023-02-15 19:37 出处:网络
I have written the following scala code to download a file . The file gets downloaded correctly but also an exception is thrown. The code is as follows :

I have written the following scala code to download a file . The file gets downloaded correctly but also an exception is thrown. The code is as follows :

var out:OutputStream = null
var in:InputStream = null

      try {
        var url:URL = null
        url = new URL("http://somehost.com/file.doc")
        val uc 开发者_JS百科= url.openConnection()
        val connection = uc.asInstanceOf[HttpURLConnection]
        connection.setRequestMethod("GET")
        val buffer:Array[Byte] = new Array[Byte](1024)
        var numRead:Int = 0
        in = connection.getInputStream()
        var localFileName="test.doc"
        out = new BufferedOutputStream(new FileOutputStream(localFileName))
        while ((numRead = in.read(buffer)) != -1) {
              out.write(buffer,0,numRead);
        }
      }
      catch {
        case e:Exception => println(e.printStackTrace())
      }

      out.close()
      in.close()

The file gets downloaded but the following exception is thrown :

java.lang.IndexOutOfBoundsException
    at java.io.FileOutputStream.writeBytes(Native Method)
    at java.io.FileOutputStream.write(FileOutputStream.java:260)
    at java.io.BufferedOutputStream.write(BufferedOutputStream.java:105)
    at TestDownload$.main(TestDownload.scala:34)
    at TestDownload.main(TestDownload.scala)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:115)
()

Why could this be happening and any way to fix it ?

Please Help Thank You


Scala returns type Unit, not the type of the value being assigned, with an assignment statement. So

numRead = in.read(buffer)

never returns -1; it doesn't even return an integer. You can write

while( { numRead = in.read(buffer); numRead != -1 } ) out.write(buffer, 0, numRead)

or you can go for a more functional style with

Iterator.continually(in.read(buffer)).takeWhile(_ != -1).foreach(n => out.write(buffer,0,n))

Personally, I prefer the former since it's shorter (and relies less on iterator evaluation happening the way "it ought to").


An alternative option is to use the system commands which is much cleaner and faster from what I can tell.

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

new URL("http://somehost.com/file.doc") #> new File("test.doc") !!
0

精彩评论

暂无评论...
验证码 换一张
取 消