具體來說,我將一個文件上傳保存在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