web-dev-qa-db-fra.com

Impression de Runtime exec () OutputStream sur la console

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();
        }
    }
}
35
TheWolf

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 ()

1
Eugene Kuleshov

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 :)

99
Benjamin Gruenbaum

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();
37
Stijn Geukens

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();
12
samaitra

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.

2
yegor256

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()));
1
radiantRazor

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!

1
Mohamed Anees A