是否有一种很好的,安全的,快速的方法将InputStream写入Scala中的文件?

pr1*_*001 18 java scala inputstream file lift

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

not*_*xit 35

使用Java 7,您可以使用Files 新的File I/O:

Files.copy(from, to)
Run Code Online (Sandbox Code Playgroud)

其中fromto可以是PathS或InputStream秒.这样,您甚至可以使用它方便地从jar中打包的应用程序中提取资源.


Rex*_*err 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 }
}
Run Code Online (Sandbox Code Playgroud)

但是如果你还需要其他图书馆,你可以通过使用它们来让你的生活更轻松(正如米歇尔所说).

(PS - 在Scala 2.7中,getLines不应该有()它.)

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


Mic*_*mer 8

我不知道任何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))
Run Code Online (Sandbox Code Playgroud)