如何将过程的输出复制到文件和控制台(在Kotlin程序中)

时间:2019-12-04 15:57:23

标签: kotlin

我有一个简单的Kotlin代码片段

import java.io.*
import java.util.concurrent.TimeUnit.MINUTES
import java.util.concurrent.TimeUnit


val proc = ProcessBuilder("C:\\tools\\build\\maven\\3.6.1\\bin\\mvn.cmd")
    .directory(null)
    .redirectOutput(ProcessBuilder.Redirect.PIPE)
    .redirectError(ProcessBuilder.Redirect.PIPE)
    .start()
println("Started")
proc.waitFor(60, TimeUnit.MINUTES)
println("Ended")
val output : String = proc.inputStream.bufferedReader().readText()
println("Output : " + output)
var log : File = File("cmd.log")
log.writeText(output)

此代码运行命令然后将输出保存为字符串,然后将输出打印到控制台 但是,在外部程序完成时会进行打印。 我的问题是: 我想以实时模式查看程序输出。 从其他方面来说,我希望看到外部程序在工作时的输出。 这段代码作为Kotlin脚本运行:kotlinc -script script.ktc

如果放置字符串

val output : String = proc.inputStream.bufferedReader().readText()

在waitFor调用之前。我观察到执行被阻止了

1 个答案:

答案 0 :(得分:0)

很抱歉,这个问题很简单,我今天找到了简单的答案。

val proc = ProcessBuilder("ls", "-lR", "c:\\toolchains")
    .directory(null)
    .redirectOutput(ProcessBuilder.Redirect.PIPE)
    .redirectError(ProcessBuilder.Redirect.PIPE)
    .start()
println("Started")
val output: BufferedReader = proc.inputStream.bufferedReader()
var line: String? = output.readLine()
val log: File = File("cmd.log")
while (line != null) {
    println("Next Line " + line)
    log.appendText(line.toString() + System.lineSeparator())
    line = output.readLine()
}

proc.waitFor(60, TimeUnit.MINUTES)
println("Ended")