Ved den første whileløkke kommer det rigtige resultat, men så prøver jeg at skrive til processen "uci" og enter/newline og det burde resultere i at processen skriver noget tekst... men den anden whileløkke giver intet, så hvor er fejlen?
Kan problemet ikke være at in.readLine() ikke bliver null? for det er kun hvis jeg manuelt terminere det eksterne program at der hoppes ud af while løkken:
Det egentlige formål er at jeg starter programmet, så skriver den noget tilbage til mig og mens den stadig kører så skriver jeg nogle kommandoer til den, som den så giver nåået output på.
Har du testet om dit eksterne program modtager din message og sender det rigtige tilbage? Altså fra det eksterne programs side? Bruger du også close og flush på dine BufferedWriter og close på BufferedReader?
jeg bruger ikke close og flush... jamen jeg er ikke sikker på om processen får det rigtige input fra BufferedWriter... Når jeg kører programmet fra kommandoprompten, så giver den først noget output og dernæst skal jeg indtaste "uci" efterfulgt af et tryk på enter, så giver den noget output tilbage og så venter den på en ny kommando...
programmet jeg kører er følgende simple Echo program:
import java.io.*;
public class Echo { public static void main(String[] args) throws Exception { System.out.println("start"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String line; while((line = br.readLine()) != null) { System.out.println(line); } System.out.println("slut"); } }
først er der den simpel løsning hvor vi kun læser til sidst:
import java.io.*;
public class Simple { public static void main(String[] args) throws Exception { Process p = Runtime.getRuntime().exec(new String[] { "java", "Echo" }); BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream())); PrintStream ps = new PrintStream(p.getOutputStream()); ps.println("A"); ps.println("BB"); ps.println("CCC"); ps.close(); String line; while((line = br.readLine()) != null) { System.out.println(line); } br.close(); } }
så er der en variant hvor vi udnytter kendskab til hvor mange linier vi skal læse hvornår:
import java.io.*;
public class Know { public static void main(String[] args) throws Exception { Process p = Runtime.getRuntime().exec(new String[] { "java", "Echo" }); BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream())); PrintStream ps = new PrintStream(p.getOutputStream()); String line; // vi ved der kommer "start" line = br.readLine(); System.out.println(line); // skriv 3 linier ps.println("A"); ps.println("BB"); ps.println("CCC"); ps.close(); // vi ved der kommer 3 linier line = br.readLine(); System.out.println(line); line = br.readLine(); System.out.println(line); line = br.readLine(); System.out.println(line); // vi ved der kommer "slut" line = br.readLine(); System.out.println(line); br.close();
} }
og så er der varianten med en reader tråd:
import java.io.*;
public class ReaderThread { public static void main(String[] args) throws Exception { Process p = Runtime.getRuntime().exec(new String[] { "java", "Echo" }); BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream())); Thread t = new Reader(br); t.start(); PrintStream ps = new PrintStream(p.getOutputStream()); ps.println("A"); ps.println("BB"); ps.println("CCC"); ps.close(); t.join(); } }
Jeg kunne ikke få dit eksempel til at virke helt, men jeg fandt ud af at programmet ikke returnerer null mens det stadig kører, så man skal tjekke om den er ready.
Mange tak for hjælpen!
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.