/ Forside / Teknologi / Udvikling / Java / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java
#NavnPoint
molokyle 3688
Klaudi 855
strarup 740
Forvirret 660
gøgeungen 500
Teil 373
Stouenberg 360
vnc 360
pmbruun 341
10  mccracken 320
Eksternt program, STDIO & STDIN
Fra : WinstonSmith_101@hot~


Dato : 17-10-06 18:04

Jeg har et eksternt program jeg skal eksekvere, som tager et argument.
Så jeg har denne kode:

String command = "...";
String argument = "...";
process = Runtime.getRuntime().exec(command);

Og for at sende argumenterne:

java.io.OutputStream out = process.getOutputStream();
out.write(argument.getBytes());
out.close();

Og for at læse fra output fra det eksterne program:

java.io.InputStream in = process.getInputStream();
int c;
while ((c = in.read()) != -1) {
System.out.print("OUT: " + (char)c);
}
in.close();

= = = = = = = = = = = = = = = = = =

Men problemet er at output fra det eksterne program ikke bliver læst.
Det bliver stadig sendt til stdio når input-strømmen bliver lukket
(in.close();) - men altså ikke af min kode.

Er der ikke en måde at eksekvere et eksternt program og samtidigt
både sende argumenter til det og fange dets output? Hver for sig
fungere de godt. Hvis det eksterne program ikke forventer input og jeg
ikke åbner OutputStream så opfanger c=read() outputtet fra det
eksterne program?


 
 
Kim Jersin (18-10-2006)
Kommentar
Fra : Kim Jersin


Dato : 18-10-06 09:07

Kommunikationen med det eksterne program er asynkron. Så du bliver nødt
til at starte en ekstra tråd. Typisk bruger man en hjælpetråd til at
sende data til programmet, mens ens egen hovedtråd læser.

I din kode nedenfor har jeg antydet hvad du skal gøre!

Du bliver nok nødt til at lave noget fejlhåndtering i trådens run()
metode, men det skal compileren nok belære dig om....

En anden ting du skal være opmærksom på er at det eksterne program også
kan sende sit output til stderr, så det kan være at det er
getErrorStream() som du skal anvende. Hvis programmet har output på
begge - jeps, så skal der gang i endnu en tråd!!!

Hvis du bruger java version 1.5 (5.0) el. nyere, så bør du kigge på
ProcessBuilder klassen. Bla. er det muligt at sætte et flag så man kan
få sammensmeltet stdout og stderr til en strøm (og derved undgå 2 tråde
til at læse).

/Kim

WinstonSmith_101@hotmail.com skrev:
> Jeg har et eksternt program jeg skal eksekvere, som tager et argument.
> Så jeg har denne kode:
>
> String command = "...";

// Denne bliver nødt til at være erklæret final
final String argument = "..."
> String argument = "...";

> process = Runtime.getRuntime().exec(command);
>
> Og for at sende argumenterne:
>

Thread tt = new Thread {
public void run() {
> java.io.OutputStream out = process.getOutputStream();
> out.write(argument.getBytes());
> out.close();
}
};
tt.start();

>
> Og for at læse fra output fra det eksterne program:
>
> java.io.InputStream in = process.getInputStream();
> int c;
> while ((c = in.read()) != -1) {
> System.out.print("OUT: " + (char)c);
> }
> in.close();
>
> = = = = = = = = = = = = = = = = = =
>
> Men problemet er at output fra det eksterne program ikke bliver læst.
> Det bliver stadig sendt til stdio når input-strømmen bliver lukket
> (in.close();) - men altså ikke af min kode.
>
> Er der ikke en måde at eksekvere et eksternt program og samtidigt
> både sende argumenter til det og fange dets output? Hver for sig
> fungere de godt. Hvis det eksterne program ikke forventer input og jeg
> ikke åbner OutputStream så opfanger c=read() outputtet fra det
> eksterne program?
>

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408914
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste