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();
}
Process
OuputStream
(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
Vous devez ajouter le caractère de fin de ligne ("\ n").
comme:
writer.write("I'm from the stdin!.\n");
writer.flush();