Scala:如何从终端读取行并将其存储为字符串?

Scala:如何从终端读取行并将其存储为字符串?,scala,Scala,我正在尝试编写一个框架,用于使用Scala执行外部命令。我有一个场景,我使用wget命令下载一个zip文件,并使用unzip命令解压缩该文件 为了执行这些命令,我做了如下一些实现: case class wget_builder[wget <: CommandExecutor](i: Seq[String]) { import Cmd_Framework.wget_builder._ protected def this() = this(Seq.empty[String]

我正在尝试编写一个框架,用于使用Scala执行外部命令。我有一个场景,我使用
wget
命令下载一个zip文件,并使用
unzip
命令解压缩该文件

为了执行这些命令,我做了如下一些实现:

case class wget_builder[wget <: CommandExecutor](i: Seq[String]) {
    import Cmd_Framework.wget_builder._
    protected def this() = this(Seq.empty[String])
    def URL(url: String): wget_builder[wget with URL] = new wget_builder(i :+ url)
    def optionBackground(): wget_builder[wget with WGETOptions] = new wget_builder(i :+ "-b")
    def optionNoVerbose(): wget_builder[wget with WGETOptions] = new wget_builder(i :+ "-nv")
    def build(implicit ev: wget =:= full_wget_command) = ("wget " + i.mkString(" ")).!!
}

object wget_builder {
    def apply(): wget_builder[wget_builder.EmptyCommand] = new wget_builder
    sealed trait EmptyCommand extends CommandExecutor
    sealed trait URL extends CommandExecutor
    sealed trait Output extends CommandExecutor
    sealed trait WGETOptions extends CommandExecutor
    type full_wget_command = EmptyCommand with URL with WGETOptions
}

case class unzip_builder[unzip <: CommandExecutor](i: Seq[String]) {
    import Cmd_Framework.unzip_builder._
    protected def this() = this(Seq.empty[String])
    def optionJ(): unzip_builder[unzip with UZOptions] = new unzip_builder(i :+ "-j")
    def optionQ(): unzip_builder[unzip with UZOptions] = new unzip_builder(i :+ "-q")
    def zipFileName(file: String): unzip_builder[unzip with File] = new unzip_builder(i :+ file)
    def build(implicit ev: unzip =:= full_unzip_command) = println(("unzip " + i.mkString(" ")).!!)
}

object unzip_builder {
    def apply(): unzip_builder[unzip_builder.EmptyCommand] = new unzip_builder
    sealed trait EmptyCommand extends CommandExecutor
    sealed trait UZOptions extends CommandExecutor
    sealed trait File extends CommandExecutor
    type full_unzip_command = EmptyCommand with UZOptions with File
}
它工作正常,下载zip文件,并在成功执行后显示一条语句,如下所示:

2019-11-25 19:38:26 URL:http://archives.textfiles.com/100.zip [1135379/1135379] -> "100.zip" [1]
我知道,这与我运行命令时终端将返回的语句相同

wget "http://archives.textfiles.com/100.zip" -nv
我要做的是,我需要提取上面提到的语句并获取文件名,在本例中为
100.zip
,并将此名称传递给
unzip\u生成器


我有没有办法做到这一点?感谢您的帮助。多谢各位

由于
wget
将其结果写入StdErr,因此必须使用
ProcessLogger
捕获输出以进行进一步处理

import sys.process._

val errBuf = new StringBuilder

Seq("wget", "http://archives.textfiles.com/100.zip", "-nv")
   .!!(ProcessLogger(_ => (), errBuf.addAll))

val filename = errBuf.toString.replaceAll(".*-> \"(.*)\".*", "$1")
//filename: String = 100.zip

由于
wget
将其结果写入StdErr,因此必须使用
ProcessLogger
捕获输出以进行进一步处理

import sys.process._

val errBuf = new StringBuilder

Seq("wget", "http://archives.textfiles.com/100.zip", "-nv")
   .!!(ProcessLogger(_ => (), errBuf.addAll))

val filename = errBuf.toString.replaceAll(".*-> \"(.*)\".*", "$1")
//filename: String = 100.zip

为什么从候机楼来?
ProcessBuilder
方法
返回进程的标准输出作为结果。为什么不能从上面刮下来呢?(顺便说一句,我建议不要使用
mkString()
。改用
(“wget”+:I)。!!
)当我执行生成器时,它不会返回任何标准输出,对象是空的。为什么从终端?
ProcessBuilder
方法
返回进程的标准输出作为结果。为什么不能从上面刮下来呢?(顺便说一句,我建议不要使用
mkString()
。请改用
(“wget”+:I)。!!
当我执行生成器时,它不会返回任何标准输出,对象是空的。