Scala交互式解释器(REPL)-如何将输出重定向到文本文件?

7

是否有可能在这种情况下使用常规的Windows或Linux命令行中有效的>>> 符号,如果可以,该如何实现?

3个回答

15

您可以通过控制台编程来实现:

import java.io.FileOutputStream
import scala.Console

Console.setOut(new FileOutputStream("<output file path>"))

从现在开始,所有的printprintln输出都会被重定向到这个文件中。


由于SI-4793setOut在2.9 REPL中无法正常工作。请参见我的回答 - 4e6
1
虽然不完美,但我接受这是最有用的答案。我注意到有时文件中没有任何内容,直到我退出REPL。为了解决这个问题,需要将FileOutputStream存储在一个val中,并调用close将内容刷新到文件中。 - Gigatron
很奇怪,现在已经过时了:<console>:82: 警告: DeprecatedConsole类中的setOut方法已弃用(自2.11.0以来):请使用withOut Console.setOut(new FileOutputStream("output.txt"))除了它还可以工作外, withOut似乎还没有起作用... - Techmag

4

从您的问题中不清楚您想如何使用这样的东西,提供一个示例可能有所帮助。

这里有一个隐式函数,它将添加一个简单的运算符,将任何对象写为字符串到文件中。 (请注意,我使用>>表示Unix风格的>,因为>在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"

这会在当前工作目录下生成一个名为 "out.txt" 的文件,其中包含 List(1, 2, 3)


这是我想要做的事情--例如,如果我调用返回一个整数列表的calculateSomething(a,b,c)函数,理想情况下它会将calculateSomething函数内的printprintln语句输出到文件,并将返回的列表结果发送到文件中。 - Gigatron

0

在我看来,它似乎工作正常:

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

1
谢谢,但那是在操作系统命令行中,不是在运行的 REPL 会话内部。 - Gigatron
1
@Gigatron 只需生成字符串而不是打印,然后将其发送到文件中就很容易了。但如果您展示了您想要实现的目标,而不是询问如何实现您期望的解决方案,我们都可以更有帮助。 - Daniel C. Sobral

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接