具体来说,我将文件上传保存到Lift Web应用程序中的本地文件。
答案 0 :(得分:31)
使用Java 7,您可以使用Files
from the new File I/O:
Files.copy(from, to)
其中from
和to
可以是Path
s或InputStream
s。这样,您甚至可以使用它方便地从jar中打包的应用程序中提取资源。
答案 1 :(得分:18)
如果它是一个文本文件,并且你想限制自己使用Scala和Java,那么使用scala.io.Source
进行读取可能是最快的 - 它不是内置的,但很容易编写:
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 }
}
但是如果你还需要其他图书馆,你可以通过使用它们来让你的生活更轻松(正如米歇尔所说)。
(P.S .--在Scala 2.7中,getLines
之后不应该有()
。)
(P.P.S .--在旧版本的Scala中,getLines
未删除换行符,因此您需要print
而不是println
。)
答案 2 :(得分:8)
我不了解任何Scala特定的API,但由于Scala与Java完全兼容,因此您可以使用Apache Commons IO和Apache 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))
答案 3 :(得分:1)
上面给出的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()
}