Avatar billede hite Nybegynder
16. november 2006 - 16:48 Der er 3 kommentarer og
1 løsning

Process.getOutputStream()

Hej Eksperter.

Jeg har et problem som jeg har fået besvaret før, men hvis svar ikke virker i java 1.5.0.

Det jeg ønsker er at starte et program (simsys) med Runtime.getRuntime().exec("simsys").
og herefter kommunikere med det ved at oprette en læsetråd og en skrivetråd. Mit problem er at jeg ikke kan lave skrivetråden. Følgende er koden som jeg ønsker den, dog for eksemplets skyld kalder jeg "rev" (som i linux læser fra stdin og skriver hver linie baglæns).
<pre>
import java.io.*;
   
public class Example {
    public Example () {
        try {
        Runtime rt = Runtime.getRuntime();
        Process proc = rt.exec("rev");
       
        StreamGobbler errorGobbler =
        new StreamGobbler(proc.getErrorStream(), "ERROR");
     
        StreamGobbler outputGobbler =
        new StreamGobbler(proc.getInputStream(), "OUTPUT");
     
        errorGobbler.start();
        outputGobbler.start();

        proc.getOutputStream().write("reverse me\n\r".getBytes());
        proc.getOutputStream().write("and me\n\r".getBytes());
        proc.getOutputStream().write("also me\n\r".getBytes());
        proc.getOutputStream().write("asdf\n\r".getBytes());
        proc.getOutputStream().write((char)4);
        proc.getOutputStream().flush();
        int exitCode = proc.waitFor();
        System.out.println("exit code: " + exitCode);
      } catch (Throwable t) {
      t.printStackTrace();
      }
  }

  public static void main (String[] args) {
    new Example();
  }

class StreamGobbler extends Thread {
  InputStream is;
  String type;

  StreamGobbler(InputStream is, String type ) {
  this.is = is;
  this.type = type;
  }

  public void run() {
    try {
    InputStreamReader isr = new InputStreamReader(is);
    BufferedReader br = new BufferedReader(isr);
    String line = null;
    while ((line = br.readLine()) != null) {
    System.out.println(type + ">" + line);
    }
    } catch (IOException ioe) {
    ioe.printStackTrace();
    }
  }
}
}
</pre>

Når jeg kører ovenstående program forventer jeg at følgende bliver skrevet til skærmen:
<pre>
em esrever
em dna
em osla
fdsa
</pre>

Jeg har set spørgsmålet (eller lignende) stillet mange steder før .. eksempelvis:

http://forum.java.sun.com/thread.jspa?forumID=4&threadID=221173

http://forum.java.sun.com/thread.jspa?forumID=4&threadID=290316

http://forum.java.sun.com/thread.jspa?forumID=4&threadID=291150

Og jeg har selv stillet det her: http://www.eksperten.dk/spm/629751 , men ingen steder besvares mit spørgsmål. Hjælp udbedes .. jeg er villig til at ødsle .. igen.
Avatar billede hite Nybegynder
16. november 2006 - 16:51 #1
Faktisk forventer jeg at
OUTPUT>em esrever
OUTPUT>em dna
OUTPUT>em osla
OUTPUT>fdsa
bliver skrevet til skærmen
Avatar billede hite Nybegynder
16. november 2006 - 17:44 #2
Fremskridt. Jeg har fået den til at producere de ønskede output ved at skrive:
        proc.getOutputStream().write("reverse me\n\r".getBytes());
        proc.getOutputStream().write("and me\n\r".getBytes());
        proc.getOutputStream().write("also me\n\r".getBytes());
        proc.getOutputStream().write("asdf\n\r".getBytes());
        proc.getOutputStream().write((char)4);
        proc.getOutputStream().flush();
        proc.getOutputStream().close(); //TILFØJET
        int exitCode = proc.waitFor();
        System.out.println("exit code: " + exitCode);

Dette er fint, men det er stadig ikke muligt at lave en egentlig interaktion med rev. Det jeg altså gerne i princippet vil er følgende:
        proc.getOutputStream().write("reverse me\n\r".getBytes());
        proc.getOutputStream().close(); //TILFØJET
        proc.getOutputStream().write("and me\n\r".getBytes());
        proc.getOutputStream().close(); //TILFØJET
        proc.getOutputStream().write("also me\n\r".getBytes());
        proc.getOutputStream().close(); //TILFØJET
        proc.getOutputStream().write("asdf\n\r".getBytes());
        proc.getOutputStream().close(); //TILFØJET
        proc.getOutputStream().write((char)4);
        proc.getOutputStream().close(); //TILFØJET
        proc.getOutputStream().flush();
        int exitCode = proc.waitFor();
        System.out.println("exit code: " + exitCode);

Og altså kigge på output efter hver write til getOutputStream() og forhold mig til dem. Dette kaster dog en IOException hvilket ikke er så mærkeligt da jeg prøver at skrive til en lukket OutputStream
Avatar billede hite Nybegynder
16. november 2006 - 17:46 #3
Det virker som om flush kommandoen ikke virker, eller at den først flusher når man lukker outputStream.
Avatar billede hite Nybegynder
10. oktober 2007 - 14:55 #4
Det lader ikke til at hverken eksperterne eller java-udviklerne kan give svar .. jeg lukker.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester