具体来说,我将一个文件上传保存在Lift web应用程序中的本地文件中。有没有一种很好的,安全的,快速的方法来写入InputStream到Scala中的文件?
11
A
回答
17
如果它是一个文本文件,并要限制自己的Scala和Java,然后使用scala.io.Source
做阅读可能是fastest--它不是内置的,但容易写:
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 }
}
但是如果你需要其他的库,无论如何,你可以让你的生活,甚至使用它们(米歇尔说明)更容易。
(PS - 斯卡拉2.7,getLines
不应该有一个()
后)。
(PPS - 在老版本的斯卡拉,getLines
没有删除换行符,所以你需要print
代替。println
)
7
我不知道任何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))
25
使用Java 7,您可以使用Files
from the new File I/O:
Files.copy(from, to)
其中from
和to
可以是Path
s或InputStream
s。这样,您甚至可以使用它来方便地从包装在jar中的应用程序中提取资源。
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()
}
相关问题
- 1. Object.isArray()很慢,有没有一种快速的方法来做到这一点?
- 2. 有没有一种很好的方法来分类wp
- 3. CoreData - 有没有一种很好的方法来放置物品?
- 4. 有没有更好的方法来写这种Ruby的条件?
- 5. 有没有一种快速的方法来重建拼音文件名单?
- 6. 有没有一种快速解锁Emacs中的键的方法?
- 7. 有没有更好的方法来编写这种方法?
- 8. 有没有一种快速找到约束所在的方法?
- 9. MVC - 有没有一种很好的方法来捆绑各自的javascript控件?
- 10. 有没有一种快速的方式来显示在Scala控制台中声明的方法的代码?
- 11. 有没有一种很好的方式来包含额外的文件?
- 12. 有没有一种更新SQL中很多记录的快速方法?
- 13. 有没有一种快速的方法将文件复制到SD卡
- 14. 有没有一种很好的方法来禁用SQLAlchemy中的DML?
- 15. 有没有一种快速的方法来减少Python中多行的缩进?
- 16. 有没有一种快速的方法来搜索R中的变量?
- 17. 有没有一种快速的方法来删除VS 2010中的大括号?
- 18. 有没有另外一种方法来写入文件中的数据?
- 19. 有没有一种快速有效的方法来在Javascript中乘数组?
- 20. 有没有一种安全的方法来删除JointJS文件/图
- 21. 有没有一种快速的方法来从点或分支来源“git diff”?
- 22. 有没有一种很好的方法来获取当前的属性名称?
- 23. 有没有一种很好的方法来隐藏用户的网址?
- 24. 有没有一种很好的方法来在Spark中添加单词?
- 25. Scala中的PrintWriter没有写入文件?
- 26. 有没有一种快速的方法来删除在C#中使用语句?
- 27. 将InputStream写入Java中的文件的有效方法6
- 28. 有没有一种快速获取磁盘上文件数的方法?
- 29. 有没有一种快速的方法将实体转换为.csv文件?
- 30. 在Emacs中有没有一种快速方法来进行文字换行?
此代码失去换行符。 – shinichy 2017-01-27 00:17:52
@shinichy - 自从我写出答案以来,行为发生了变化。我已经更新了它。 – 2017-02-06 15:42:14
感谢您的更新! – shinichy 2017-02-08 10:31:33