21

具体来说,我正在将文件上传保存到 Lift Web 应用程序中的本地文件。

4

4 回答 4

40

使用 Java 7 或更高版本,您可以Files 从新的 File I/O使用:

Files.copy(from, to)

其中fromto可以是Paths 或InputStreams。这样,您甚至可以使用它方便地从打包在 jar 中的应用程序中提取资源。

于 2013-02-21T15:39:31.450 回答
20

如果它是一个文本文件,并且您想限制自己使用 Scala 和 Java,那么使用scala.io.Sourceto 进行读取可能是最快的——它不是内置的,但易于编写:

def inputToFile(is: java.io.InputStream, f: java.io.File) {
  val in = scala.io.Source.fromInputStream(is)
  val out = new java.io.PrintWriter(f)
  try { in.getLines().foreach(out.println(_)) }
  finally { out.close }
}

但是,如果您仍然需要其他库,则可以通过使用它们来使您的生活更加轻松(如 Michel 所示)。

(PS——在 Scala 2.7 中,后面getLines不应该有()。)

(PPS--在旧版本的 Scala 中,getLines没有删除换行符,所以你需要print代替println.)

于 2010-05-06T17:50:27.260 回答
9

我不知道任何 Scala 特定的 API,但由于 Scala 与 Java 完全兼容,您可以使用任何其他库,如Apache Commons IOApache Commons FileUpload

这是一些示例代码(未经测试):

//using Commons IO:
val is = ... //input stream you want to write to a file
val os = new FileOutputStream("out.txt")
org.apache.commons.io.IOUtils.copy(is, os)
os.close()

//using Commons FileUpload
import javax.servlet.http.HttpServletRequest
import org.apache.commons.fileupload.{FileItemFactory, FileItem}
import apache.commons.fileupload.disk.DiskFileItemFactory
import org.apache.commons.fileupload.servlet.ServletFileUpload
val request: HttpServletRequest = ... //your HTTP request
val factory: FileItemFactory = new DiskFileItemFactory()
val upload = new ServletFileUpload(factory)
val items = upload.parseRequest(request).asInstanceOf[java.util.List[FileItem]]
for (item <- items) item.write(new File(item.getName))
于 2010-05-06T17:13:32.790 回答
4

上面给出的 inputToFile 方法不适用于像 .pdf 文件这样的二进制文件。它在尝试将文件解码为字符串时引发运行时异常。对我有用的是:

def inputStreamToFile(inputStream: java.io.InputStream, file: java.io.File) = {
    val fos = new java.io.FileOutputStream(file)
    fos.write(
      Stream.continually(inputStream.read).takeWhile(-1 !=).map(_.toByte).toArray
    )
    fos.close()
}
于 2014-10-08T12:34:18.280 回答