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()