有没有一种很好、安全、快速的方法可以将 InputStream 写入 Scala 中的文件?

Posted

技术标签:

【中文标题】有没有一种很好、安全、快速的方法可以将 InputStream 写入 Scala 中的文件?【英文标题】:Is there a nice, safe, quick way to write an InputStream to a File in Scala? 【发布时间】:2011-02-16 11:31:02 【问题描述】:

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

【问题讨论】:

【参考方案1】:

对于 Java 7 或更高版本,您可以使用 Files from the new File I/O:

Files.copy(from, to)

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

【讨论】:

这之后你需要打电话给close吗? Files本身并不代表文件,而是I/O函数的静态集合,所以不需要关闭。 Files.copy 不会操纵您传入的流,因此无论您需要在那里关闭什么,都必须关闭自己。 无法调用此方法,因为 ``` 错误:(25, 11) 使用替代方法重载了方法值副本:(x$1: java.nio.file.Path,x$2: java. io.OutputStream)Long (x$1: java.io.InputStream,x$2: java.nio.file.Path,x$3: java.nio.file.CopyOption*)Long (x$1: java .nio.file.Path,x$2: java.nio.file.Path,x$3: java.nio.file.CopyOption*)java.nio.file.Path 不能应用于 (java.io.InputStream, java. io.File) Files.copy(content, distTemporaryFile) ``` 您似乎将File 作为第二个参数传递,而函数需要Path。您可以通过File.toPath() 获取Path【参考方案2】:

如果它是一个文本文件,并且你想限制自己使用 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 

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

(附注——在 Scala 2.7 中,getLines 后面不应有 ()。)

(附注--在旧版本的 Scala 中,getLines 没有删除换行符,因此您需要使用 print 而不是 println。)

【讨论】:

【参考方案3】:

我不知道任何 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))

【讨论】:

【参考方案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()

【讨论】:

以上是关于有没有一种很好、安全、快速的方法可以将 InputStream 写入 Scala 中的文件?的主要内容,如果未能解决你的问题,请参考以下文章

有没有一种很好的跨平台方法来使用 CMake 包含外部 C++ 库?

有没有一种很好的方法来模拟 Go 中的“可能”或“选项”类型?

有没有一种很好的 LINQ 方法来做笛卡尔积?

有没有办法以从 django 视图中作为上下文传递的一种很好的方式在 html 中显示 json 结果?

Kotlin:如何将两个语句“应用”和“让”以一种很好的方式放在一起?

有哪些技术可以从网页中提取导航菜单?