J'essaye d'obtenir le OutputStream
du Process
initié par exec()
à la console. Comment cela peut-il être fait?
Voici un code incomplet:
import Java.io.BufferedReader;
import Java.io.File;
import Java.io.IOException;
import Java.io.OutputStream;
import Java.io.PrintStream;
import Java.io.Reader;
public class RuntimeTests
{
public static void main(String[] args)
{
File path = new File("C:\\Dir\\Dir2");
String command = "cmd /c dir";
Reader rdr = null;
PrintStream prtStrm = System.out;
try
{
Runtime terminal = Runtime.getRuntime();
OutputStream rtm = terminal.exec(command, null, path).getOutputStream();
prtStrm = new PrintStream(rtm);
prtStrm.println();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
Vous devez démarrer un nouveau thread qui lira le flux de sortie du terminal et le copiera sur la console, après avoir appelé process.waitFor ()
J'ai récemment rencontré ce problème et je voulais juste mentionner que depuis Java 7 le api du générateur de processus a été développé. Ce problème peut maintenant être résolu avec:
ProcessBuilder pb = new ProcessBuilder("yourcommand");
pb.redirectOutput(Redirect.INHERIT);
pb.redirectError(Redirect.INHERIT);
Process p = pb.start();
J'espère que ça aide :)
Je pense que c'est ce que vous recherchez:
String line;
Process p = Runtime.getRuntime().exec(...);
BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
while ((line = input.readLine()) != null) {
System.out.println(line);
}
input.close();
J'ai rencontré le même problème et j'utilise le code suivant.
Process p = Runtime.getRuntime().exec(".....");
p.waitFor();
String line;
BufferedReader error = new BufferedReader(new InputStreamReader(p.getErrorStream()));
while((line = error.readLine()) != null){
System.out.println(line);
}
error.close();
BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
while((line=input.readLine()) != null){
System.out.println(line);
}
input.close();
OutputStream outputStream = p.getOutputStream();
PrintStream printStream = new PrintStream(outputStream);
printStream.println();
printStream.flush();
printStream.close();
Essayez VerboseProcess
à partir de jcabi-log :
String output = new VerboseProcess(new ProcessBuilder("foo.bat")).stdout();
La classe démarre un thread d'arrière-plan, écoute le flux de sortie et l'enregistre.
Si vous pouvez utiliser org.Apache.commons.io.IOUTils de commons-io,
System.out.println(IOUtils.toString(process.getInputStream()));
System.err.println(IOUtils.toString(process.getErrorStream()));
Je sais que c'est une très vieille question, mais une meilleure alternative pour les réponses ci-dessus serait
ProcessBuilder builder = new ProcessBuilder(command);
builder.inheritIO();
Process p = builder.start();
À partir des documents de ProcessBuilder.inheritIO()
,
Définit la source et la destination des E/S standard du sous-processus comme étant identiques à celles du processus Java Java actuel.
J'espère que cela aide quelqu'un!