Input/Output Einlesen von der Konsole mit InputStreamReader

coldstone

Bekanntes Mitglied
Hallo Java Freunde,

kann mir jemand vielleicht sagen was ich bei diesem code falsch mache?

Java:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Eingabe {

    public static void main(String[] args) throws IOException {
      
        String kommando = textEingeben("");
        String ls = "ls";
      
     if (kommando == ls)     {
          System.out.println(ls);
      }
     else {
         System.out.println("Falsche eingabe");
     }
    }

    public static String textEingeben(String wertBez) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    
        System.out.print(">" + wertBez);
        return br.readLine();
    }
  
}

Ziel ist es die Eingabe über die konsole zu vergleichen, falls identisch eingabe wieder ausgeben lassen fals nicht identisch "Falsche eingabe" ausgeben. Aber es wird immer wieder "Falsche Eingabe" ausgegeben. Was mache ich bei dem vergleich falsch?
 
K

kneitzel

Gast
Strings werden nicht mit == sondern mit einem equals Aufruf verglichen. Bei == ist es lediglich ein Vergleich der Referenz.
Also ein if (ls.equals(kommando)) statt einem if (kommando == ls)
 

coldstone

Bekanntes Mitglied
Java:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class eingabe{

    public static void main(String[] args) throws IOException {
    
        String kommando = textEingeben("");
     
        String ls = "ls";
        String touch = "touch";
        String rm = "rm";
        String cd = "cd";
        String mv = "mv";
        String cp = "cp";
        String pwd = "pwd";
        String cat = "cat";
        String mkdir = "mkdir";
        String rmdir = "rmdir";
    
     if (kommando.equals(touch))     {
          System.out.println(touch);
      }
     if (kommando.equals(ls))     {
         System.out.println(ls);
     }
     if (kommando.equals(rm))     {
         System.out.println(rm);
     }
     if (kommando.equals(cd))     {
         System.out.println(cd);
     }
     if (kommando.equals(mv))     {
         System.out.println(mv);
     }
     if (kommando.equals(cp))     {
         System.out.println(cp);
     }
     if (kommando.equals(pwd))     {
         System.out.println(pwd);
     }
     if (kommando.equals(cat))     {
         System.out.println(cat);
     }
     if (kommando.equals(mkdir))     {
         System.out.println(mkdir);
     }
     if (kommando.equals(rmdir))     {
         System.out.println(rmdir);
     } else {
      
        System.out.println(kommando + ": command not found");
     }
    }

     
    public static String textEingeben(String wertBez) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  
        System.out.print(">" + wertBez);
        return br.readLine();
    }

}

jedesmal wenn einen der String werte einlese gibt er mir die "else" Bedingung mit aus. Wie kann ich die "else" Bedingung so einbinden, das sie für alle IF Abfragen gilt?

OK. Habe gerade gemerkt das es mit switch ja viel einfacher ist. :D
 
Zuletzt bearbeitet:
K

kneitzel

Gast
Ja genau, hier bietet sich sein switch an. Aber der gepostete Code hat das Problem, dass das else sich nur auf das letzte if bezog. Wenn man so eine Kette an Vergleichen mit if machen will, dann wäre das Konstrukt wie folgt aufzubauen:
Code:
if (..) {
} 
else if (..) {
}
else if (..) {
}
else {
}

Durch den else Bereich nach jedem if bricht er bei einer Übereinstimmung diese Vergleichskette ab.
 

Viktim

Bekanntes Mitglied
Du könntest auch eine Liste nehmen, in die Du alle deine Bash-Komandos reinschreibst, und dann ein einer for-Schleife deinen Vergleich machen, das wäre viel kürzer ;) und du müsstest, wenn du ein neues Komando hinzufügen willst, es einfach nur zur Liste hinzutun :D
In der For-Schleife könntest du dann einfach einen Boolean auf true setzten oder so, wenn ein Wert erfolgreich verglichen wurde, und danach dann eine Prüfung mit dem Boolean machen, der die Fehlerausgabe regelt.
 
K

kneitzel

Gast
Der Objektorientierte Ansatz wäre hier evtl. eine Klasse oder Interface Command zu bauen. Da wäre dann sowas wie String getName() oder aber auch execute(String[] args) enthalten.

Dann hat man eine Liste von Klassen mit Commands. Diese geht man dann beim Start einmalig durch und
- schaut nach dem default Konstruktor und erstellt eine Instanz.
- legt dann eine HashMap an, in der halt Name und Instanz abgelegt werden.

Dann kann man nach einem Kommando ganz einfach schauen:
Command command = knownCommands.get(kommando);

Und dann kann man auch die Funktionalität direkt abbilden: command.execute(arguments);

So wird der Code gleich schön auf mehrere Klassen aufgeteilt.
 

Jardcore

Top Contributor
Dann hat man eine Liste von Klassen mit Commands. Diese geht man dann beim Start einmalig durch und
- schaut nach dem default Konstruktor und erstellt eine Instanz.
- legt dann eine HashMap an, in der halt Name und Instanz abgelegt werden.

Erstellt man die speziellen Commands dann durch Reflection, bzw. wo bekommt man die Liste her?
Gibt es dann sowas wie MkdirCommand TouchCommand usw.?
 
K

kneitzel

Gast
Also einmalig muss man Reflection anwenden, um den Konstruktor zu bekommen. Danach hat man die Instanzen und kann das Interface nutzen.

Was gegen dieses Model spricht sind die Instanzen der Klassen. Die sind etwas unschön in meinen Augen und das wäre ein Grund, das Model noch etwas weiter aufzubohren.

So wäre ein Factory Pattern noch sinnvoll. Statt also die Kommandos aufzulisten, listet man dann nur noch Factories auf. Diese können dann Dinge wie:
- eine Liste der bekannten Befehle bringen. (In der Hash-Table hat man dann Befehl hin zu einer Instanz eines Interfaces mit createCommand(...) => Argumente habe ich jetzt nicht im Kopf. Weiter unten mehr.
- dann bei Bedarf die Commands erstellen. Das kann direkt im Listener sein oder über Anonyme Klassen / Lambdas.

So Commands werden etwas komplexer. So braucht ein Command:
- Argumente
- Eingabe-Stream
- Ein Ausgabe-Stream für die Ausgabe ist wichtig.
- Verschachtelte Commands!

Die Ein- und Ausgabestreams können reine Properties sein. Aber es wird schon recht komplex.

ls | more wäre dann eine Struktur, bei der ich von Hinten nach Vorne vorgehen würde:
more Befehl wird erzeugt, Tastatur-Eingabe bekommt dieses Command und die Ausgabe bekommen wir.
Dann wird ein ls Befehl erzeugt und der bekommt dann den more Befehl mit übergeben:
- ls bekommt keine Tastatureingabe und die Ausgabe bekommen nicht wir.
- ls gibt die Ausgabe an more weiter. (more hat damit zwei Eingaben - einmal die Tastur und einmal vom more Befehl!)
- Wenn ls gestartet wird, wird auch more gestartet!

Und das Interface wäre dann halt ein CommandCreator. In der Factory könnte da entweder die Factory selbst angegeben werden (Damit das Design möglich ist, ist der Befehl selbst auch ein Argument!) und dann wird da wieder ein if / switch statement benötigt.) oder das wird dann aufgebaut mit anonymen Klassen und im Konstruktor der Factory wird dann die Liste aufgebaut mit Code wie
Code:
..... = new CommandCreator() { // Analog dem ActionListener - da sieht es ja ähnlich aus ...
  public Command createCommand(String command, String[] args, Command parent) {
    // Some code
  }
}

Das kann man immer weiter ausbauen. Das ist jetzt auch nur eine Gedankenspielerei. Das ist also sehr grob wie es evtl. aussehen könnte.
 

coldstone

Bekanntes Mitglied
Hallo,

Java:
.
.
.
String kommando = textEingeben("");  
        String[] teilen = kommando.split(" ");
        String argument = "argument";
.
.
.

ich versuche den eingelesenen String zu splitten und danach auszugeben. Nur will es nicht so wie ich es mir vostelle.

Java:
.
.
.
    case "ls":       System.out.println("command: '" + teilen[0] + "' with " + argument + " arguments (s)");break;
.
.
.

also teilen[0] soll den ersten wert ausgeben, indem fall "ls". Er gibt mir aber die komplette Zeile aus.
Mache ich bei der Split Methode was falsch oder bei der Ausgabe?

OK, es hat mit dem ....case "ls".... zu tun. Kann ich bei der "case" anweisung eine überprüfung einbauen wie
Java:
case teilen[0] == "ls":       System.out.println("command: '" + teilen[0] + "' with " + argument + " arguments (s)");break;
?
 
Zuletzt bearbeitet:
K

kneitzel

Gast
Wenn Du in kommando den ganzen Befehl hast und du das in das array teilen[] aufgeteilt hast, dann willst Du evtl. etwas wie folgt machen:
Code:
switch (teilen[0]) {
  case "ls":  // Code für ls
...
}

Also im case darf nur ein Wert stehen. Ein teilen[0]=="ls" ist da nicht zulässig. Zumal bei Strings ja auch nicht mit == sondern mit equals verglichen werden soll.

Hat Dir das weiter geholfen? Denn leider habe ich nicht alles voll verstanden, so dass ich evtl. für Dich wichtige Punkte nicht verstanden habe. Ggf. postest Du einmal den ganzen Code zum drüberschauen?
 

coldstone

Bekanntes Mitglied
Vielen lieben dank für die Hilfe. Habe den Fehler jetzt gefunden.
ich hatte als switch folgendes stehen:

Java:
switch (kommando)  {
      
             case "ls":        System.out.println("command: '" + teilen[0] + "' with " + argument + " arguments (s)");break;

nachdem ich es auf

Java:
switch (teilen[0])  {
      
             case "ls":        System.out.println("command: '" + teilen[0] + "' with " + argument + " arguments (s)");break;

geändert habe funktioniert es auch wie ich es mir vorgestellt habe. :D

Wie kann ich eigentlich die restlichen "argumente" zählen? Also ich meine alles wörter ausser teilen[0]?
 

VfL_Freak

Top Contributor
Moin,

Java:
.
String kommando = textEingeben(""); 
        String[] teilen = kommando.split(" ");
        String argument = "argument";
ich versuche den eingelesenen String zu splitten und danach auszugeben. Nur will es nicht so wie ich es mir vostelle.
oder klappt das Splitten schon nicht ?? :rolleyes:
Was genau steht in "kommando" drin ?

Gruß Klaus
 

coldstone

Bekanntes Mitglied
So jetzt hat es geklappt. Auch das Zählen der Argumente mit einer for schleife. Nur er zählt alle wörter.
Wie kann ich alle wörter zählen ausser teilen[0]?

Kann ich nicht gleich bei der Ausgabe den Wert auf -1 setzen? Also eins runterzählen?

Java:
    case "ls":     System.out.println("command: '" + teilen[0] + "' with " + teilen.length + " arguments (s)");break;
 
Zuletzt bearbeitet:

coldstone

Bekanntes Mitglied
Java:
   case "ls":     System.out.println("command: '" + teilen[0] + "' with " + (teilen.length - 1) + " arguments (s)");break;

in klammern setzen bringt Wunder mit sich. :D
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P Datei einlesen, nach Begriff filtern und in Datei ausgeben. Problem Standardausgabe über Konsole Java Basics - Anfänger-Themen 19
W Werte durch Konsole einlesen Java Basics - Anfänger-Themen 10
P Array einlesen von Konsole Java Basics - Anfänger-Themen 8
I OOP Objektnamen über die Konsole richtig einlesen Java Basics - Anfänger-Themen 9
J Zahlen aus Konsole einlesen Java Basics - Anfänger-Themen 1
P Einlesen von der Konsole Java Basics - Anfänger-Themen 3
M Input/Output Zeichen on Konsole einlesen Java Basics - Anfänger-Themen 3
S Beliebigen Tastendruck "einlesen" (ohne Konsole) Java Basics - Anfänger-Themen 3
K Methoden Einlesen einer unbegrenzten Matrix über Konsole Java Basics - Anfänger-Themen 6
J Java Daten von Konsole einlesen (Spezielles Problem) Java Basics - Anfänger-Themen 6
A Zahl von Konsole einlesen Java Basics - Anfänger-Themen 43
J Termine über Konsole einlesen Java Basics - Anfänger-Themen 8
M einzelnes zeichen aus konsole einlesen Java Basics - Anfänger-Themen 2
J Matrix als ganzes von Konsole einlesen Java Basics - Anfänger-Themen 5
I Daten über Konsole einlesen Java Basics - Anfänger-Themen 4
F Einlesen einer URL per Konsole Java Basics - Anfänger-Themen 15
G Zeichen von der Konsole einlesen Java Basics - Anfänger-Themen 5
D nur ein Zeichen einlesen (Konsole) Java Basics - Anfänger-Themen 7
farbenlos Csv Datei in Java einlesen Java Basics - Anfänger-Themen 18
G JTree speichern und wieder einlesen Java Basics - Anfänger-Themen 5
T Text einlesen code was kommt dahin? Java Basics - Anfänger-Themen 1
S SeriellenPort einlesen Java Basics - Anfänger-Themen 3
I XML einlesen und Objekte bekommen Java Basics - Anfänger-Themen 2
M Daten aus .txt Datei einlesen und weiterverarbeiten Java Basics - Anfänger-Themen 80
julian0507 Wörter einlesen lassen und rückwärts ausgeben Java Basics - Anfänger-Themen 7
S JSON einlesen und benutzen Java Basics - Anfänger-Themen 5
A CSv.Datei einlesen und die werte in zweidemosional Int Array speichern Java Basics - Anfänger-Themen 9
I Ical4j / Kalender einlesen von URL - Fehler: "Unparseable date" Java Basics - Anfänger-Themen 16
Saiko Zeilen einer Datei einlesen Java Basics - Anfänger-Themen 3
sserio Txt Datei einlesen Java Basics - Anfänger-Themen 9
D Strings aus Excel-Datei einlesen Java Basics - Anfänger-Themen 2
julian112 Input/Output .gz bzw. .txt Datei Einlesen und Umgang mit Exceptions Java Basics - Anfänger-Themen 1
M String beim einlesen formatieren Java Basics - Anfänger-Themen 12
G JSP Textfeld einlesen Java Basics - Anfänger-Themen 2
M Einlesen > new Leser Java Basics - Anfänger-Themen 5
A Array einlesen und ausgeben Java Basics - Anfänger-Themen 13
K Datum einlesen und Tag, Monat und Jahr einzeln ausgeben Java Basics - Anfänger-Themen 1
K Datum einlesen und Tag, Monat und Jahr einzeln ausgeben Java Basics - Anfänger-Themen 1
KogoroMori21 Textdatei einlesen im Array (Selection Sort Algorithmus) Java Basics - Anfänger-Themen 3
S Wort einlesen Array ausgeben Java Basics - Anfänger-Themen 4
I Java String einlesen und auslesen Java Basics - Anfänger-Themen 11
A Input/Output Mehrere Csv-Dateien einlesen Java Basics - Anfänger-Themen 2
S CSV einlesen und mit Komma trennen Java Basics - Anfänger-Themen 12
CptK Richtigen Pfad beim einlesen von Datei finden Java Basics - Anfänger-Themen 2
I Java-Wort einlesen und ausgeben Java Basics - Anfänger-Themen 7
J Csv-Datei einlesen Java Basics - Anfänger-Themen 52
JD_1998 Arrays einlesen, zwischenspeichern und wieder ausgeben Java Basics - Anfänger-Themen 8
L Konstruktor für eine Map-Datei/Map-Datei einlesen Java Basics - Anfänger-Themen 5
L Datein einlesen Java Basics - Anfänger-Themen 1
O zufälliges Wort aus einer Datei einlesen Java Basics - Anfänger-Themen 32
E Input/Output Datei anhand von Dateinamen einlesen Java Basics - Anfänger-Themen 5
C Datei über relative Pfade einlesen Java Basics - Anfänger-Themen 6
A Input/Output Dateien einlesen und ausgeben Java Basics - Anfänger-Themen 7
A Klasse um daten zu einlesen Java Basics - Anfänger-Themen 26
A 2d Arrays aus txt.file einlesen Java Basics - Anfänger-Themen 16
A Textdatei mit stream einlesen Java Basics - Anfänger-Themen 2
P Datei einlesen und zurückgeben Java Basics - Anfänger-Themen 5
G String wird nach Einlesen aus Datei nicht erkannt Java Basics - Anfänger-Themen 3
M String in Scanner einlesen Java Basics - Anfänger-Themen 6
E TXT FILE EINLESEN Java Basics - Anfänger-Themen 4
M Einzelzeichen einlesen Java Basics - Anfänger-Themen 2
C (char) Array einlesen Java Basics - Anfänger-Themen 8
B HTML File einlesen inkl. Bilder? Java Basics - Anfänger-Themen 2
E Mehrere Eingabezeilen gleichzeitig einlesen Java Basics - Anfänger-Themen 7
B HTML Datei einlesen und HTML Code in String wandeln Java Basics - Anfänger-Themen 19
V Schleife für das Einlesen von Werten für int Variablen, die Bestandteil von Arrays sein sollen Java Basics - Anfänger-Themen 16
I Nur auf Abfrage von einer Text Datei einlesen Java Basics - Anfänger-Themen 11
P Text Datei einlesen und übertragen Java Basics - Anfänger-Themen 15
E Einteilung der Räume mit einlesen einer .txt datei Java Basics - Anfänger-Themen 16
D Eingaben in String Array einlesen Java Basics - Anfänger-Themen 12
B CSV einlesen - Parameter a) encoding b) delimiter Java Basics - Anfänger-Themen 7
R Compiler-Fehler Einlesen von Konsolenparameter funtioniert nichtmehr Java Basics - Anfänger-Themen 4
J Einlesen von Datei funktioniert nicht Java Basics - Anfänger-Themen 8
H Einlesen Java Basics - Anfänger-Themen 8
H Einlesen von Zahlen Java Basics - Anfänger-Themen 20
B mehrere Werte mit scanner und while schleife einlesen, max berechnen bzw addieren Java Basics - Anfänger-Themen 2
CptK Datentypen Text Dateien einlesen Java Basics - Anfänger-Themen 3
A Datentypen Unterschiedliche Datentypen in einer Eingabe einlesen Java Basics - Anfänger-Themen 2
R txt Einlesen und Verarbeiten Java Basics - Anfänger-Themen 15
M Erste Schritte CSV-File einlesen und Daten verarbeiten Java Basics - Anfänger-Themen 5
M Datei einlesen mit Scanner funktioniert nicht (FileNotFoundException) Java Basics - Anfänger-Themen 6
K Sonderzeichen einlesen Java Basics - Anfänger-Themen 3
L Input/Output XML Datei einlesen (JAXB?) Java Basics - Anfänger-Themen 10
F Zahlen aus Datei einlesen und in Array speichern Java Basics - Anfänger-Themen 2
I Datei einlesen Java Basics - Anfänger-Themen 11
J Best Practice [Code Verbesserung] TXT einlesen und in Arrayliste speichern Java Basics - Anfänger-Themen 5
A Ungeordnetes Array ordnen, Zahl einlesen und einordnen Java Basics - Anfänger-Themen 23
R Erste Schritte Sicheres einlesen eines Strings Java Basics - Anfänger-Themen 2
MaximilianTM Input/Output Einlesen und bearbeiten einer text Datei / Zeile Java Basics - Anfänger-Themen 5
C Erste Schritte Regex - Datei einlesen und splitten Java Basics - Anfänger-Themen 4
T Input/Output Einlesen eines .txt Files nur bei gesetztem Breakpoint möglich Java Basics - Anfänger-Themen 1
L RSA Public Key einlesen Java Basics - Anfänger-Themen 0
K Datei aus unbekannten Speicherorten einlesen Java Basics - Anfänger-Themen 1
T Datei in Array einlesen "null" Java Basics - Anfänger-Themen 8
U Daten aus Datei einlesen Java Basics - Anfänger-Themen 4
J Auslesen/speichern und wieder einlesen Java Basics - Anfänger-Themen 7
N Datei Zeilenweise einlesen, Ausgabe mehrere Arrays Java Basics - Anfänger-Themen 7
B Excel File einlesen und Überschrift prüfen Java Basics - Anfänger-Themen 8
M Einlesen von Integerwertern aus einer CSV Java Basics - Anfänger-Themen 8
? Methoden Boolean Wert vergleichen und einlesen Java Basics - Anfänger-Themen 1

Ähnliche Java Themen

Neue Themen


Oben