【问题标题】:Scala interactive interpreter (REPL) - how to redirect the output to a text file?Scala 交互式解释器 (REPL) - 如何将输出重定向到文本文件?
【发布时间】:2012-02-29 05:26:51
【问题描述】:

有没有可能,如果有的话是怎么做的?在 Windows 或 Linux 命令行上工作的常用 >>> 在这种情况下不起作用。

【问题讨论】:

    标签: scala read-eval-print-loop redirectstandardoutput


    【解决方案1】:

    您可以从控制台以编程方式执行此操作:

    import java.io.FileOutputStream
    import scala.Console
    
    Console.setOut(new FileOutputStream("<output file path>"))
    

    从现在开始,所有printprintln 都将被定向到该文件中

    【讨论】:

    • 由于SI-4793setOut 在 2.9 REPL 中不起作用。见my answer
    • 虽然不完美,但我接受这是最有用的答案。我注意到有时在我退出 REPL 之前文件中没有任何内容。要解决这个问题,需要将 FileOutputStream 存储在 val 中,然后在其上调用 close 以将内容刷新到文件中。
    • 奇怪的是,它现在已被弃用:&lt;console&gt;:82: warning: method setOut in class DeprecatedConsole is deprecated (since 2.11.0): use withOut Console.setOut(new FileOutputStream("output.txt")) 除了它还可以工作withOut 似乎还没有工作......
    【解决方案2】:

    从你的问题中不清楚你想如何使用这样的东西。您尝试做的事情的一个例子可能会有所帮助。

    这是一个隐式函数,它将添加一个简单的运算符,将任何对象作为字符串写入文件。 (请注意,我使用 &gt;&gt; 表示 unix 风格的 &gt;,因为 &gt; 在 Scala 中已经有意义(“小于”)。如果您愿意,可以将其替换为其他运算符。)

    implicit def anyToFileOutput(self: Any) = new {
      import java.io._
      def >>(filename: String) {
        val f = new BufferedWriter(new FileWriter(filename))
        try {
          f.write(self.toString)
        } finally {
          if (f != null)
            f.close()
        }
      }
    }
    

    你会这样使用它:

    scala> List(1,2,3) >> "out.txt"
    

    在包含List(1, 2, 3)的工作目录中生成一个文件“out.txt”

    【讨论】:

    • 这就是我想要做的——例如,如果我调用calculateSomething(a,b,c),它会返回一个Ints 列表,理想情况下它会引导printprintln calculateSomething 中的语句到文件,并将返回的列表结果发送到文件。
    【解决方案3】:

    对我来说似乎工作正常:

    dcs@ayanami:~/github/scala (master)$ scala -e "println(2 * 2)" > output
    dcs@ayanami:~/github/scala (master)$ cat output
    4
    

    【讨论】:

    • 谢谢,但这是在操作系统命令行中,而不是在运行的 REPL 会话中。
    • @Gigatron 只需生成字符串而不是打印,然后很容易发送到文件。再说一次,如果您展示了您打算完成的工作,而不是询问如何实施您想要的解决方案,我们都会更有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-25
    • 1970-01-01
    • 2021-10-26
    • 1970-01-01
    • 1970-01-01
    • 2013-04-21
    相关资源
    最近更新 更多