J'ai une chaîne dont j'ai besoin pour m'exécuter dans un programme externe, puis relire la sortie. Je comprends comment lire la sortie en arrière, mais comment puis-je canaliser cette chaîne en entrée? Merci!Ajout d'une chaîne dans Java Runtime.exec() en tant qu'entrée
Répondre
attention que vous ne créez pas une impasse. Lire/écrire sur le processus dans le même thread peut être problématique si le processus écrit des données que vous ne lisez pas et que vous écrivez des données qu'il ne lit pas.
J'ai tendance à utiliser une petite ligne de modèle ce pour obtenir le io va dans différentes discussions:
import java.io.InputStream;
import java.io.OutputStream;
public final class Pipe implements Runnable {
private final InputStream in;
private final OutputStream out;
public Pipe(InputStream in, OutputStream out) {
this.in = in;
this.out = out;
}
public static void pipe(Process process) {
pipe(process.getInputStream(), System.out);
pipe(process.getErrorStream(), System.err);
pipe(System.in, process.getOutputStream());
}
public static void pipe(InputStream in, OutputStream out) {
final Thread thread = new Thread(new Pipe(in, out));
thread.setDaemon(true);
thread.start();
}
public void run() {
try {
int i = -1;
byte[] buf = new byte[1024];
while ((i = in.read(buf)) != -1) {
out.write(buf, 0, i);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
Cela peut ou ne peut pas demander à ce que vous voulez faire - peut-être votre affaire à un ensemble établi d'entrée qui est garanti pour apparaître après certaine sortie attendue (ou vice versa, ou plusieurs itérations de cela). C'est à dire. un bloc synchrone et une sorte d'interaction. Mais si vous observez simplement quelque chose qui pourrait apparaître, alors c'est un bon début dans la bonne direction. Vous passeriez dans des flux différents et travailleriez dans un code de type java.util.concurrent 'await (long, TimeUnit) pour attendre la réponse. Java IO bloque pour toujours les opérations read(), donc vous séparer de ces threads vous permettra d'abandonner après un certain temps si vous n'obtenez pas la réponse attendue du processus externe.
Il va comme ça (non testé et non compilé)
Process p = Runtime . getRuntime () . exec (...) ;
Writer w = new java . io . OutputStreamWriter (p . getOutputStream ()) ;
w . append (yourString) ;
w. flush () ;
// read the input back