Anzeige:
Ergebnis 1 bis 9 von 9

Thema: Java & Linux & Runtime

  1. #1
    krisooo
    Gast

    Java & Linux & Runtime

    Hi,
    ich wollte ein kleines Java Programm schreiben, dass mit

    (Runtime.getRuntime()).exec("xterm");

    ein xterm startet, dann sich die Input- und Output-streams holt, auf Eingaben vom Benutzer wartet und die dann über die Streams an den xterm weiterleitet. Das Problem bei mir ist, das die weiterleitung an den xterm nicht läuft. Ich schreibe einfach in den Outpustream mit hilfe der write() Methode die Befehle rein also z. B. output.write("ls"), dabei passiert leider gar nichts in dem xterm. Der Code sieht so aus:

    public class CommandLine {

    public static void main(String[] args){
    CommandLine cmd = new CommandLine("xterm");
    }

    Runtime runtime;
    Process cmdLine;
    BufferedReader system_in;
    BufferedReader cmdLine_in;
    OutputStreamWriter cmdLine_out;
    String system_line;
    String cmdLine_line;

    /** Creates a new instance of CommandLine */
    public CommandLine(String cmdLineString) {
    try{
    runtime = Runtime.getRuntime();
    cmdLine = runtime.exec(cmdLineString);
    system_in = new BufferedReader(new InputStreamReader(System.in));
    cmdLine_in = new BufferedReader(new InputStreamReader(cmdLine.getInputStream()));
    cmdLine_out = new OutputStreamWriter(cmdLine.getOutputStream());
    while(!(system_line = system_in.readLine()).equalsIgnoreCase("exit")){
    cmdLine_out.write(system_line);
    while((cmdLine_line = cmdLine_in.readLine()) != null){
    System.out.println("OUT: "+cmdLine_line);
    }
    }
    }
    catch(IOException ioe){
    System.err.println("## Exception ## : "+ioe.getMessage());
    }
    System.exit(0);
    }

    }

    Hat jemand eine Lösung für mich?
    MfG
    Chris

  2. #2
    Registrierter Benutzer Avatar von SeeksTheMoon
    Registriert seit
    22.02.2002
    Beiträge
    762
    mir ist nicht bekannt, wie man auf diese Art und Weise mit einem externen Programm kommunizieren kann, denn letztendlich willst Du ja die Kontrolle über das xterm übernehmen.
    Ich habe sowas mal mit CVS versucht und bin dann genau an der Kommunikation beider Programme gescheitert.

    Falls es doch geht und Du es herausfindest, dann musst Du hier unbedingt mal die Lösung posten...
    I haven't lost my mind - It's somewhere on a backup-disc

  3. #3
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Ich glaube nicht, dass xterm über den den Standardinput Stream Kommandos einliest.

    Terminal Emulatoren stellen schliesslich eine virtuelle Konsole dar, da hat man Input über die Tastatur.

    RunTime.exec ist für Programme, die Inputdaten verarbeiten und eine Output produzieren.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  4. #4
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Original geschrieben von SeeksTheMoon
    Ich habe sowas mal mit CVS versucht und bin dann genau an der Kommunikation beider Programme gescheitert.
    Hmm, cvs sollte gehen, nur cvs login wahrscheinlich nicht, aber das muss man eh nur einmal machen.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  5. #5
    krisooo
    Gast
    kann ich dann eine shell benutzte ? wenn ja, dannn welche?

  6. #6
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Du musst halt einfach ausprobieren, ob einer der Shellinterpreteer gepipte Kommandos ausführt.

    Allerdings ist die Frage, warum du die Kommandos nicht gleich selbst ausführst?

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  7. #7
    krisooo
    Gast
    OK, ich habs endlich...

    public class CommandLine {

    public static void main(String[] args){
    CommandLine cmd = new CommandLine("/bin/bash");
    }

    Runtime runtime;
    Process cmdLine;
    BufferedReader system_in;
    BufferedWriter cmdLine_out;
    BufferedReader cmdLine_in;
    String system_line;
    String cmdLine_line;

    /** Creates a new instance of CommandLine */
    public CommandLine(String cmdLineString) {
    try{
    runtime = Runtime.getRuntime();
    cmdLine = runtime.exec(cmdLineString);
    system_in = new BufferedReader(new InputStreamReader(System.in));
    cmdLine_in = new BufferedReader(new InputStreamReader(cmdLine.getInputStream()));
    cmdLine_out = new BufferedWriter(new OutputStreamWriter(cmdLine.getOutputStream()));

    while(!(system_line = system_in.readLine()).equalsIgnoreCase("exit")){
    cmdLine_out.write(system_line+"\n");
    cmdLine_out.flush();
    try{
    Thread.sleep(100);
    }catch(Exception e){};
    while(cmdLine_in.ready()){
    System.out.println("OUT: " + cmdLine_in.readLine());
    }
    }
    }
    catch(IOException ioe){
    System.err.println("## Exception ## : "+ioe.getMessage());
    }
    System.exit(0);
    }

    }

    jetzt nur noch das ganze mit RMI verbinden und dann hab ich was ich haben wollte ; )

  8. #8
    Registrierter Benutzer Avatar von SeeksTheMoon
    Registriert seit
    22.02.2002
    Beiträge
    762
    Original geschrieben von anda_skoa
    Hmm, cvs sollte gehen, nur cvs login wahrscheinlich nicht, aber das muss man eh nur einmal machen.

    Ciao,
    _
    jo, gerade der Login geht so nicht. Und ohne login kann man CVS vergessen (außer man will nur checkouts machen, da braucht man i.d.R kein login)
    I haven't lost my mind - It's somewhere on a backup-disc

  9. #9
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Original geschrieben von SeeksTheMoon
    jo, gerade der Login geht so nicht. Und ohne login kann man CVS vergessen (außer man will nur checkouts machen, da braucht man i.d.R kein login)
    Login braucht leider ein Terminal oder zumindest Pseudoterminal.

    Aber wie gesagt braucht man ansich pro Repository nur ein login.

    Danach kann man checkut, update, commit, add, remove, etc machen, ohne Passworteingabe, weil das ja schon in .cvspass steht.

    Login ist bei CVs wirklich ein Sonderfall.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •