首页 文章

Scala:在一个语句中将字符串写入文件

提问于
浏览
119

对于在Scala中读取文件,有

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

是否有一种等效和简洁的方法来将字符串写入文件?

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

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

我想将代码用于从单行到短代码的程序 . 必须使用自己的库在这里没有意义 . 我希望有一种现代语言能让我方便地写一些文件 .

有类似的帖子,但他们没有回答我的确切问题或专注于较旧的Scala版本 .

例如:

13 回答

  • 1

    如果你喜欢Groovy语法,你可以使用Pimp-My-Library设计模式将它带到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
    
  • 6

    我写的一个微型图书馆:https://github.com/pathikrit/better-files

    file.write("Hi!")
    

    要么

    file << "Hi!"
    
  • 2
    import sys.process._
    "echo hello world" #> new java.io.File("/tmp/example.txt") !
    
  • 2

    这简洁,我想:

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

    更新:我已经创建了一个更有效的解决方案,我在这里详细说明:https://stackoverflow.com/a/34277491/501113

    我发现自己在Scala IDE for Eclipse中的Scala工作表中工作越来越多(我相信在IntelliJ IDEA中有相同的东西) . 无论如何,我需要能够做一个单行输出一些内容,因为我得到“输出超过截止限制” . 如果我正在做任何重要的事情,特别是对于Scala集合,请留言 .

    我想出了一个单行插入每个新Scala工作表的顶部以简化这一点(因此我不必为了一个非常简单的需要进行整个外部库导入练习) . 如果你是一个坚持者,并注意到它在技术上是两行,那只是为了让它在这个论坛中更具可读性 . 它是我的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")
    

    这允许我可选地提供文件名,如果我想要超出默认值的其他文件(每次调用方法时都会完全覆盖文件) .

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

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

    请享用!

  • 59

    简洁的一行:

    import java.io.PrintWriter
    new PrintWriter("filename") { write("file contents"); close }
    
  • 40

    奇怪的是没有人建议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本身 .

  • 21

    通过分号的魔力,你可以制作任何你喜欢的单线 .

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

    您可以轻松使用Apache File Utils . 看看函数 writeStringToFile . 我们在项目中使用此库 .

  • 11

    一个也有这种格式,它既简洁又底层库写得很漂亮(参见源代码):

    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!")
    
  • 78

    您可以使用Java和Scala库的组合来完成此操作 . 您将完全控制字符编码 . 但不幸的是,文件句柄将无法正常关闭 .

    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"))
    
  • 6

    这是一个使用Scala编译器库的简洁单行程序:

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

    或者,如果您想使用Java库,您可以执行以下操作:

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

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

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

    如果您不关心异常处理,那么您可以编写

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

相关问题