web-dev-qa-db-fra.com

Écriture dans InputStream d'un processus Java

J'ai un code qui démarre un processus Java (c'est-à-dire: exécuter un code Java Java) compilé via

ProcessBuilder builder = new ProcessBuilder("Java", "Sample", "arg1", "arg2");
builder.redirectErrorStream(true);
Process process = builder.start();

Grâce à cela, je peux essentiellement traiter la sortie et les erreurs

OutputStream stdin = process.getOutputStream(); // <- Eh?
InputStream stdout = process.getInputStream();

BufferedReader reader = new BufferedReader(new InputStreamReader(stdout));
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(stdin));

// reader.readLine() blah blah

Maintenant, comment envoyer une entrée au stdin? Autrement dit, si le code exécuté par le processus a une ligne qui attend une entrée comme dans:

Scanner scan = new Scanner(System.in);
String val = scan.nextLine();
System.out.println(val);

J'ai essayé ceci:

writer.write("I'm from the stdin!.");
writer.flush();

Bien que rien ne se soit produit. La console attendait toujours une entrée.

Des pensées?

EDIT: La question a été répondue, comme accepté ci-dessous. J'édite pour montrer le code défectueux (que je n'ai pas réussi à inclure btw. Lol).

Avant la partie writer.write(), j'avais un

String line;
line = reader.readLine();
while (line != null) {
    System.out.println(line);
    line = reader.readLine();
}
19
Gx.Zero

ProcessOuputStream (notre point de vue) est le STDIN du point de vue du processus

OutputStream stdin = process.getOutputStream(); // write to this

Donc ce que vous avez doit être correct.

Mon chauffeur (appliquez vos propres meilleures pratiques avec des déclarations d'essayer avec des ressources)

public class ProcessWriter {
    public static void main(String[] args) throws Exception {
        ProcessBuilder builder = new ProcessBuilder("Java", "Test");
        builder.directory(new File("C:\\Users\\sotirios.delimanolis\\Downloads"));
        Process process = builder.start();

        OutputStream stdin = process.getOutputStream(); // <- Eh?
        InputStream stdout = process.getInputStream();

        BufferedReader reader = new BufferedReader(new InputStreamReader(stdout));
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(stdin));

        writer.write("Sup buddy");
        writer.flush();
        writer.close();

        Scanner scanner = new Scanner(stdout);
        while (scanner.hasNextLine()) {
            System.out.println(scanner.nextLine());
        }
    }
}

Mon application

public class Test {

    public static void main(String[] args) throws Exception {
        Scanner console = new Scanner(System.in);
        System.out.println("heello World");
        while(console.hasNextLine()) {
            System.out.println(console.nextLine());
        }
    }
}

Exécution de pilote imprime

heello World
Sup buddy

Pour une raison quelconque, j'ai besoin de la close(). La flush() seule ne le fera pas.

Edit Cela fonctionne également si au lieu de la close() vous fournissez un \n.

Donc avec

writer.write("Sup buddy");
writer.write("\n");
writer.write("this is more\n");
writer.flush();    

le pilote imprime

heello World
Sup buddy
this is more
39

Vous devez ajouter le caractère de fin de ligne ("\ n").

comme:

writer.write("I'm from the stdin!.\n");
writer.flush();
0
Tamir Adler