2016-04-26 6 views
2

Ich habe einen ziemlich grundlegenden Prozess:liest Prozessausgang sowohl Output und String

Process p = 'foo.exe'.execute() 

Es dauert eine lange Zeit zu laufen, so möge ich einen Output ausgeben, während er ausgeführt wird. Ziemlich einfach:

p.consumeProcessOutputStream(System.out) 
p.waitForOrKill(TIMEOUT_IN_MILLIS) 

Aber jetzt möchte ich auch die Ausgabe als String. Wie kann ich das bekommen?

+2

Sie es erfassen in einem 'StringWriter' könnte und diese dann auf' Systemdruck .out' ... Oder verwenden Sie etwas wie [commons-io TeeOutputStream] (https://commons.apache.org/proper/commons-io/apidocs/org/apache/commons/io/output/TeeOutputStream.html) –

Antwort

2

Als @tim_yates Kommentare, die Sie StringWriter verwenden können, das Prozessergebnis zu speichern und die Ausgabe als String mit toString() Methode erhalten:

def sw = new StringWriter() 

Process p = 'foo.exe'.execute() 
p.consumeProcessOutputStream(sw) 
p.waitForOrKill(TIMEOUT_IN_MILLIS) 

def processOutput = sw.toString() 

Wenn Sie diese String verwenden möchten Ihre Prozessergebnis zu überprüfen, vielleicht eine Alternative Option Schriftsteller ist das Ergebnis einer File, dies zu tun, können Sie etwas ähnliches tun mit FileWriter

def fw = new FileWriter("/resultProcess.log") 

Process p = 'foo.exe'.execute() 
p.consumeProcessOutputStream(fw) 
p.waitForOrKill(TIMEOUT_IN_MILLIS) 

fw.with { 
    flush() 
    close() 
} 

Oder wie auch @tim_yates vorschlagen sowohl an Zeit in Anspruch nehmen können Sie verwenden, um von apache commons-io: TeeOutputStream und WriterOutputStream das Ergebnis String und ein File zu schreiben:

@Grab('commons-io:commons-io:2.5') 
import org.apache.commons.io.output.TeeOutputStream 
import org.apache.commons.io.output.WriterOutputStream 

// File outputresult 
def wosFw = new WriterOutputStream(new FileWriter("/resultProcess.log")) 

// String output result 
def sw = new StringWriter() 
def wosSw = new WriterOutputStream(sw) 

// create teeOutputStream with two outputStreams 
def teeOS = new TeeOutputStream(wosFw,wosSw) 

Process p = 'foo.exe'.execute() 
p.consumeProcessOutputStream(teeOS) 
p.waitForOrKill(TIMEOUT_IN_MILLIS) 

teeOS.with { 
    flush() 
    close() 
} 

def resultProcess = sw.toString()