2010-05-06 80 views

回答

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

+0

此代碼失去換行符。 – shinichy 2017-01-27 00:17:52

+0

@shinichy - 自從我寫出答案以來,行爲發生了變化。我已經更新了它。 – 2017-02-06 15:42:14

+0

感謝您的更新! – shinichy 2017-02-08 10:31:33

7

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

使用Java 7,您可以使用Filesfrom the new File I/O

Files.copy(from, to) 

其中fromto可以是Path s或InputStream s。這樣,您甚至可以使用它來方便地從包裝在jar中的應用程序中提取資源。

+0

你需要在此之後調用'close'嗎? – Jus12 2016-04-24 10:23:30

+0

'文件'本身並不代表文件,而是I/O函數的靜態集合,因此它不需要關閉。 'Files.copy'不會操縱你傳入的流,所以無論你需要關閉那裏,你都必須關閉你自己。 – notan3xit 2016-05-28 09:36:03

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() 
} 
相關問題