具体来说,我将一个文件上传保存在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. 有没有更好的方法来写这种Ruby的条件?
- 4. 有没有一种快速的方法来重建拼音文件名单?
- 5. 有没有一种快速解锁Emacs中的键的方法?
- 6. 有没有一种快速找到约束所在的方法?
- 7. MVC - 有没有一种很好的方法来捆绑各自的javascript控件?
- 8. 有没有一种快速的方式来显示在Scala控制台中声明的方法的代码?
- 9. 有没有一种更新SQL中很多记录的快速方法?
- 10. 有没有一种很好的方法来禁用SQLAlchemy中的DML?
- 11. 有没有一种快速的方法来减少Python中多行的缩进?
- 12. 有没有一种快速的方法来删除VS 2010中的大括号?
- 13. 有没有一种快速的方法来从点或分支来源“git diff”?
- 14. 有没有一种很好的方法来获取当前的属性名称?
- 15. 有没有一种很好的方法来在Spark中添加单词?
- 16. 有没有一种快速的方法来删除在C#中使用语句?
- 17. 有没有一种快速的方法将实体转换为.csv文件?
- 18. 有没有一种快速获取磁盘上文件数的方法?
- 19. 有没有一种很好的方式来处理Python中的异常?
- 20. 有没有一种很好的方法来防止重新定义jQuery?
- 21. 有没有一种快速的方法转移到Github的叉子?
- 22. 有没有更好的方法来编写下面的方法?
- 23. 有没有一种很好的方法来使onclick =“”有条件的基础上的大小?
- 24. 有没有另一种方法来创建一个更安全的形式Django
- 25. 有没有更好的方法来测试这种方法?
- 26. ImageIO.read(...) - 速度很慢,有没有更好的方法?
- 27. 有没有一种好的方法(PHP类)来访问Gmail Contacs?
- 28. 有没有一种很好的方式来设置保留属性的KVO?
- 29. 有没有一种很好的方式来处理注销时的POST
- 30. 有没有一种很好的方式来检查Android应用程序的API?
此代码失去换行符。 – shinichy 2017-01-27 00:17:52
@shinichy - 自从我写出答案以来,行为发生了变化。我已经更新了它。 – 2017-02-06 15:42:14
感谢您的更新! – shinichy 2017-02-08 10:31:33