Scala:用一个语句写入文件

为了阅读Scala中的文件,有

Source.fromFile("file.txt").mkString 

有没有一个相当简洁的方法来写入一个string文件?

大多数语言都支持这样的东西。 我最喜欢的是Groovy:

 def f = new File("file.txt") // Read def s = f.text // Write f.text = "file contents" 

我想使用代码从单行到一小段代码的程序。 不得不使用自己的库在这里没有意义。 我期望现代语言能够让我方便地将文件写入文件。

有类似这样的post,但他们不回答我确切的问题或重点是旧的Scala版本。

例如:

  • 在Scala中读取整个文件?
  • 如何在Scala中写入文件?

简洁的一行:

 new PrintWriter("filename") { write("file contents"); close } 

奇怪的是,没有人提出NIO.2操作(从Java 7开始可用):

 import java.nio.file.{Paths, Files} import java.nio.charset.StandardCharsets Files.write(Paths.get("file.txt"), "file contents".getBytes(StandardCharsets.UTF_8)) 

我认为这是迄今为止最简单,最简单,最习惯的方式,它不需要Java本身的任何依赖。

下面是一个使用Scala编译器库的简明单线程:

 scala.tools.nsc.io.File("filename").writeAll("hello world") 

另外,如果你想使用Java库,你可以做这个黑客:

 Some(new PrintWriter("filename")).foreach{p => p.write("hello world"); p.close} 

如果您喜欢Groovy语法,可以使用Pimp-My-Librarydevise模式将其带入Scala:

 import java.io._ import scala.io._ class RichFile( file: File ) { def text = Source.fromFile( file )(Codec.UTF8).mkString def text_=( s: String ) { val out = new PrintWriter( file , "UTF-8") try{ out.print( s ) } finally{ out.close } } } object RichFile { implicit def enrichFile( file: File ) = new RichFile( file ) } 

它会按预期工作:

 scala> import RichFile.enrichFile import RichFile.enrichFile scala> val f = new File("/tmp/example.txt") f: java.io.File = /tmp/example.txt scala> f.text = "hello world" scala> f.text res1: String = "hello world 
 import sys.process._ "echo hello world" #> new java.io.File("/tmp/example.txt") ! 

您可以轻松使用Apache File Utils 。 看看函数writeStringToFile 。 我们在我们的项目中使用这个库。

我写的一个微库: https : //github.com/pathikrit/better-files

 file.write("Hi!") 

要么

 file << "Hi!" 

一个也有这种格式,既简洁又底层库精美(见源代码):

 import scalax.io.Codec import scalax.io.JavaConverters._ implicit val codec = Codec.UTF8 new java.io.File("hi-file.txt").asOutput.write("I'm a hi file! ... Really!") 

这是很简洁,我猜:

 scala> import java.io._ import java.io._ scala> val w = new BufferedWriter(new FileWriter("output.txt")) w: java.io.BufferedWriter = java.io.BufferedWriter@44ba4f scala> w.write("Alice\r\nBob\r\nCharlie\r\n") scala> w.close() 

您可以使用Java和Scala库的组合来完成此任务。 您将完全控制字符编码。 但不幸的是,文件句柄将不能正确closures。

 scala> import java.io.ByteArrayInputStream import java.io.ByteArrayInputStream scala> import java.io.FileOutputStream import java.io.FileOutputStream scala> BasicIO.transferFully(new ByteArrayInputStream("test".getBytes("UTF-8")), new FileOutputStream("test.txt")) 

更新:我已经创build了一个更有效的解决scheme,我在这里详细阐述: https : //stackoverflow.com/a/34277491/501113

我发现自己在Scala IDE for Eclipse中的Scala工作表中工作得越来越多(我相信在IntelliJ IDEA中有相当的东西)。 无论如何,当我得到“输出超过临界限制”的时候,我需要能够做一行一行来输出一些内容。 消息,如果我正在做任何重要的事情,尤其是与斯卡拉集合。

我想出了一个插入到每个新的Scala Worksheet的顶部的单行程序来简化这个(所以我不必为了一个非常简单的需要而做整个外部库导入练习)。 如果你是一个坚持者,并且注意到这在技术上是两条线,那么只能在这个论坛上使它更具可读性。 这是我的Scala工作表中的单行。

 def printToFile(content: String, location: String = "C:/Users/jtdoe/Desktop/WorkSheet.txt") = Some(new java.io.PrintWriter(location)).foreach{f => try{f.write(content)}finally{f.close}} 

用法很简单:

 printToFile("A fancy test string\ncontaining newlines\nOMG!\n") 

这使我可以select提供文件名,如果我想要有超出默认值的其他文件(每次调用该方法时都完全覆盖文件)。

所以,第二个用法很简单:

 printToFile("A fancy test string\ncontaining newlines\nOMG!\n", "C:/Users/jtdoe/Desktop/WorkSheet.txt") 

请享用!

我知道这不是一条线,但据我所知,它解决了安全问题。

 // This possibly creates a FileWriter, but maybe not val writer = Try(new FileWriter(new File("filename"))) // If it did, we use it to write the data and return it again // If it didn't we skip the map and print the exception and return the original, just in-case it was actually .write() that failed // Then we close the file writer.map(w => {w.write("data"); w}).recoverWith{case e => {e.printStackTrace(); writer}}.map(_.close) 

如果你不关心exception处理,那么你可以写

 writer.map(w => {w.writer("data"); w}).recoverWith{case _ => writer}.map(_.close) 

通过分号的魔力,你可以做任何你喜欢的事情。

 import java.io.PrintWriter import java.nio.file.Files import java.nio.file.Paths import java.nio.charset.StandardCharsets import java.nio.file.StandardOpenOption val outfile = java.io.File.createTempFile("", "").getPath val outstream = new PrintWriter(Files.newBufferedWriter(Paths.get(outfile) , StandardCharsets.UTF_8 , StandardOpenOption.WRITE)); outstream.println("content"); outstream.flush(); outstream.close()