Avatar billede renerr Nybegynder
09. november 2006 - 14:20 Der er 16 kommentarer og
1 løsning

BufferedReader og BufferedWriter

import java.io.*;

public class Test {
   


    public void runscript() {
        Runtime rt = Runtime.getRuntime();
        Process pr;
        try {
            pr = rt.exec("har sat den rigtige sti");
            BufferedReader in = new BufferedReader(new InputStreamReader(pr.getInputStream()));
            String str = null;
            while((str = in.readLine()) != null) {
                System.out.println(str);
            }
            BufferedWriter out = new BufferedWriter(new OutputStreamWriter(pr.getOutputStream()));
            out.write('u');
            out.write('c');
            out.write('i');
            out.newLine();
         
            while((str = in.readLine()) != null) {
                System.out.println(str);
            }
           
        } catch(Exception e) {
        }
    }
   
   
}

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?
Avatar billede hacked Nybegynder
09. november 2006 - 14:59 #1
Din in.readLine sender null tilbage. Du kan ikke løbe igennem 2 gange.
Avatar billede renerr Nybegynder
09. november 2006 - 15:17 #2
Okay, har du et forslag til hvordan man kan få det til at virke efter hensigten?
Avatar billede arne_v Ekspert
09. november 2006 - 15:22 #3
du kunne prøve at skrive først og kun have en enkelt read løkke

ellers kan du også prøve at flytte read løkken til en separat tråd
Avatar billede hacked Nybegynder
09. november 2006 - 15:38 #4
Du kan også instantiere din BufferedReader på ny efter du har kørt den første while løkke. Ikke en pæn løsning, men en løsning.
Avatar billede renerr Nybegynder
09. november 2006 - 15:43 #5
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:

            while((str = in.readLine()) != null) {
                System.out.println(str);
            }
Avatar billede hacked Nybegynder
09. november 2006 - 15:47 #6
Det er fordi du skal destroy din Process ville jeg umiddelbart sige.
Avatar billede renerr Nybegynder
09. november 2006 - 15:53 #7
Det kan man vel først gøre når man har søgt inputtet igennem!?
Avatar billede renerr Nybegynder
09. november 2006 - 16:02 #8
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å.
Avatar billede hacked Nybegynder
09. november 2006 - 16:21 #9
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?
Avatar billede hacked Nybegynder
09. november 2006 - 16:27 #10
Hvis du ikke gør så prøv det.
Avatar billede renerr Nybegynder
09. november 2006 - 16:30 #11
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...
Avatar billede arne_v Ekspert
10. november 2006 - 02:31 #12
her er nogle eksempler der virker

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();
    }
}

class Reader extends Thread {
    private BufferedReader br;
    public Reader(BufferedReader br) {
        this.br = br;
    }
    public void run() {
        try {
            String line;
            while((line = br.readLine()) != null) {
                System.out.println(line);
            }
        } catch (IOException e) {
        }
    }
}
Avatar billede renerr Nybegynder
10. november 2006 - 16:30 #13
Jeg har prøvet den med tråden, men hos mig giver den altså ikke noget output i konsollen! er det ikke meningen?
Avatar billede renerr Nybegynder
10. november 2006 - 22:09 #14
Arne_v smider du et svar hvis du vil have nogle point?
Avatar billede arne_v Ekspert
10. november 2006 - 23:46 #15
har du fået noget til at virke ?
Avatar billede arne_v Ekspert
10. november 2006 - 23:47 #16
og et svar hvis ja
Avatar billede renerr Nybegynder
11. november 2006 - 06:02 #17
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!
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