Есть ли хороший, безопасный и быстрый способ записать InputStream в файл в Scala?
в частности, я сохраняю загрузку файла в локальный файл в веб-приложении Lift.
4 ответов
если это текстовый файл, и вы хотите ограничить себя 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 }
}
но если вам все равно нужны другие библиотеки, вы можете сделать свою жизнь еще проще, используя их (как иллюстрирует Мишель).
(П. С.--В Scala 2.7, getLines
не должно быть ()
после него.)
(П. П. С.--В старых версиях Скала, getLines
не удалить строку, так что вам нужно print
вместо println
.)
С Java 7 Вы можете использовать Files
из нового файла ввода/вывода:
Files.copy(from, to)
здесь from
и to
может быть Path
или InputStream
s. Таким образом, вы даже можете использовать его для удобного извлечения ресурсов из приложений, упакованных в банку.
Я не знаю о каком-либо конкретном API Scala, но поскольку Scala полностью совместим с Java, вы можете использовать любую другую библиотеку, такую как Apache Commons IO и Апач Викискладе 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))
метод inputToFile, приведенный выше, не работает хорошо с двоичными файлами, такими как .файл PDF. Он создает исключение времени выполнения при попытке декодировать файл в строку. Для меня сработало вот что:--2-->
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()
}