BufferedReader streikt

Hallo,

vielleicht hast Du ja eine Ahnung was hier falsch läuft:

Bei Ausführung der folgenden Programmzeilen wird der eigegebenen
Buchtaben während der Eingabe nicht angezeigt. Auch nachdem ich drücke passiert noch nichts.
Erst nachdem der erste Buchstabe NACH dem eingegeben
wird liest Java die vorangegangene Eingabe von s1 und gleich auch das erste Zeichen von s2 (ohne das irgendwas von der Eingabe angezeigt wird).
Dieses Problem besteht nur unter Windows (einmal mit jdk1.2 / Win98 und einmal mit jdk1.1.6 Win95 auf zwei verschiedenen Computern probiert, ist also vermutlich keine Datei zerschossen).
Unter Unix läuft das Programm einwandfrei! Weißt Du wo hier der Fehler stecken könnte???

Hier die betreffenden Programmzeilen:

InputStreamReader isr=new InputStreamReader(System.in); BufferedReader br=new BufferedReader(isr);
String s1=br.readLine();
String s2=br.readLine();

Vielen Dank im voraus,
Thorsten

eher eine Nachfrage…

Bei Ausführung der folgenden Programmzeilen wird der
eigegebenen
Buchtaben während der Eingabe nicht angezeigt. Auch nachdem
ich drücke passiert noch nichts.
Erst nachdem der erste Buchstabe NACH dem
eingegeben
wird liest Java die vorangegangene Eingabe von s1 und gleich
auch das erste Zeichen von s2 (ohne das irgendwas von der
Eingabe angezeigt wird).

InputStreamReader isr=new InputStreamReader(System.in);
BufferedReader br=new BufferedReader(isr);
String s1=br.readLine();
String s2=br.readLine();

Was ich nicht ganz verstehe: Du liest doch zwei Zeilen direkt
nacheinander ein, dann ist es doch klar, dass da nach dem ersten
„Enter“ erstmal nichts passiert, weil ja noch auf die zweite
gewartet wird…
Bekommst du denn die erste Zeile direkt nach der ersten Eingabe
zurückgeliefert? Gib die doch einfach mal testweise direkt danach
aus…

Dieses Problem besteht nur unter Windows (einmal mit jdk1.2 /
Win98 und einmal mit jdk1.1.6 Win95 auf zwei verschiedenen
Computern probiert, ist also vermutlich keine Datei
zerschossen).

Wenn da was kaputt wäre, dann würde auch relativ wenig
funktionieren. Die API liegt in einem JAR-Archiv, also einer
ZIP-Datei. Darüber werden Check-Summen gebildet, die verhindern,
dass da irgendwas beschädigt wird. Wenn Java also läuft, dann ist
auch die API in Ordnung…

Unter Unix läuft das Programm einwandfrei! Weißt Du wo hier
der Fehler stecken könnte???

Das ist allerdings merkwürdig. Da ich aber noch nicht ganz
verstanden habe, was du genau erreichen möchtest, also was du mit
„einwandfrei“ genau meinst, hilft mir das auch nicht unbedingt
weiter…

Der Unterschied könnte aber vielleicht auch einfach in der
Anzeige der Eingabe liegen. Wenn diese unter Windows nicht
implizit angezeigt wird - warum denn nicht? Wichtig ist ja nur,
dass alles, was du eingibst, auch im Programm landet. Ausgeben
kannst du es ja immer noch…
Ansonsten kannst du ja auch die Zeichen direkt einlesen (ohne
BufferedReader) und dann jeweils ausgeben. Bei einem „Return“
weißt du dann eben, dass das Eingabeende erreicht ist…

Für wirklich interaktive Kommandozeilenprogramme ist Java ohnehin
nicht die beste Sprache, weil es z.B. keine Bibliothek für
Textpositionierung (à-la curses) gibt…

Vielleicht fällt ja noch jemand anderem was dazu ein, ansonsten
wäre es vielleicht ganz gut zu wissen, ob du eher Wert darauf
legst, dass die Eingabe angezeigt wird oder darauf, dass sie
prompt im Programm landet…

Gruß,
Stefan :smile:

Hi Stefan!

Gut, daß du nochmal nachfragst. Ich hatte das Programm gekürzt und offensichtlich läßt sich das Problem daran nicht richtig
erklären. Also hier nochmal besser:
Das ist der betreffende Programmteil:

System.out.print("Integer: ");
s=br.readLine();
i=Integer.valueOf(s);
System.out.println(i);

System.out.print("Character: ");
s=br.readLine();
c=new Character(s.charAt(0));
System.out.println©;

Es passiert folgendes:

  1. Ausgabe "Integer: " und Eingabeprompt wird angezeigt
  2. Tippe auf der Tastatur die Taste (keine Reaktion)
  3. Tippe auf der Tastatur die Taste (keine Reaktion)
  4. Tippe (keine Reaktion!!)
  5. Tippe auf der Tastatur die Taste => die Eingabe „23“ wird
    hinter "Integer: " korrekt (aber eben zu spät und von der
    „println(i)“-Anweisung und nicht während der Eingabe!)
    angezeigt.
    In der Zeile darunter wird "Character: " angezeigt, aber noch
    ohne das eingegebene .

Ich hätte aber gerne:

  1. Ausgabe "Integer: " und Eingabeprompt wird angezeigt
  2. Tippe auf der Tastatur die Taste => 2 wird angezeigt
  3. Tippe auf der Tastatur die Taste => 3 wird angezeigt
  4. Tippe => In der nächsten Zeile wird „23“ angezeigt,
    Sprung in nächste Zeile und "Character: " wird angezeigt.
  5. Tippe auf der Tastatur die Taste => hinter "Character: "
    wird das „t“ angezeigt

Also das „normale“ Verhalten, das man von jedem anderen
Kommandozeilenprogramm kennt: Gibst was ein und kriegst dabei
Buchstabe für Buchstabe angezeigt was du grad getippt hast.
Nach erfolgt die nächste Eingabe usw.

Ich hoffe jetzt ist besser klargeworden, was das Problem ist.
Da jetzt die Buchstaben einzeln einzulesen und auszugeben kann
ja nicht die optimale Lösung sein.
Ich bin ja bescheiden und will den Cursor ja gar nicht positionieren, aber bei der Eingabe soll der eingegebene
Text halt ganz normal angezeigt werden.

Hilft diese ausführlichere Problembeschreibung? Sonst kann ich
dir ja mal den kompletten Quelltext zum Test mailen (falls du das jdk unter Windows laufen hast) …

Viele Grüße,
Thorsten

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Ich hab das Problem unter NT zumindest nicht…

Das ist der betreffende Programmteil:

System.out.print("Integer: ");
s=br.readLine();
i=Integer.valueOf(s);
System.out.println(i);

System.out.print("Character: ");
s=br.readLine();
c=new Character(s.charAt(0));
System.out.println©;

Ich hab folgendes durch den Compiler gejagt und gestartet:

import java.io.\*;
public class Test
{
 public static void main(String[] args) throws Exception
 {
 BufferedReader br =
 new BufferedReader(new InputStreamReader(System.in));

 System.out.print("Integer: ");
 String s=br.readLine();
 Integer i=Integer.valueOf(s);
 System.out.println(i);

 System.out.print("Character: ");
 s=br.readLine();
 Character c=new Character(s.charAt(0));
 System.out.println(c);
 }
}

JDK 1.2.2 sagt daraufhin das hier:

\> java Test
Integer: 12345
12345
Character: c
c

… und das genau so, wie es sein soll: nach jedem eingegebenen
Zeichen wird dieses auch angezeigt.

Ich kann mir das also nur so erklären, dass das kein Problem von
Java ist, sondern viel mehr eins von Win9x, wär ja nicht das erste…

Schreib also ruhig erst mal dein Programm zu Ende und verlass
dich darauf, dass das normalerweise funktioniert…

Gruß,
Stefan :-/

Moin

erstmal vorneweg:
die JVM und das Prog javac arbeiten unter windos komplett anderes als unter „normalen“ Betriebsystemen.

(win-javac kann z.b. nicht richtig mit subsubpackages umgehen, wie ich letzte nacht um 3 Uhr rausgefunden hab, Unix kanns…)

Das ist der betreffende Programmteil:

System.out.print("Integer: ");
s=br.readLine();
i=Integer.valueOf(s);
System.out.println(i);

Bufferreader wartet bis sein interener Buffer voll ehe er den Inhalt weitergibt. Unter Unix/Linux…etc. wird der Buffer zusätzlich regelmässig automatisch gelerrt wenn eine gewisse Zeit abgelaufen ist. unter win nicht.

Es passiert folgendes:

  1. Ausgabe "Integer: " und Eingabeprompt wird angezeigt
  2. Tippe auf der Tastatur die Taste (keine Reaktion)
  3. Tippe auf der Tastatur die Taste (keine Reaktion)
  4. Tippe (keine Reaktion!!)
  5. Tippe auf der Tastatur die Taste => die
    Eingabe „23“ wird
    hinter "Integer: " korrekt (aber eben zu spät und von der
    „println(i)“-Anweisung und nicht während der Eingabe!)
    angezeigt.
    In der Zeile darunter wird "Character: " angezeigt, aber
    noch
    ohne das eingegebene .

Das ist interessant, selbst win sollte in der lage sein die Eingabe von sich aus zu echoen. Hast du irgendwas spezielles mit system.in gemacht ? oder in Runtime rumgespielt ?

Ich hätte aber gerne:

  1. Ausgabe "Integer: " und Eingabeprompt wird angezeigt
  2. Tippe auf der Tastatur die Taste => 2 wird
    angezeigt
  3. Tippe auf der Tastatur die Taste => 3 wird
    angezeigt

Das geht nur wenn win auto-echo macht… oder mit einer Schleife die nur einen Buchstaben liest.

  1. Tippe => In der nächsten Zeile wird „23“
    angezeigt,
    Sprung in nächste Zeile und "Character: " wird angezeigt.
  2. Tippe auf der Tastatur die Taste => hinter
    "Character: "
    wird das „t“ angezeigt

Ich hoffe jetzt ist besser klargeworden, was das Problem ist.
Da jetzt die Buchstaben einzeln einzulesen und auszugeben kann
ja nicht die optimale Lösung sein.

Du arbeites nicht oft mit cross-platform systemen ?

Ich bin ja bescheiden und will den Cursor ja gar nicht
positionieren, aber bei der Eingabe soll der eingegebene
Text halt ganz normal angezeigt werden.

Hilft diese ausführlichere Problembeschreibung? Sonst kann ich
dir ja mal den kompletten Quelltext zum Test mailen (falls du
das jdk unter Windows laufen hast) …

die Stellen an denen mit System.in resp. mit Runtime gearbeitet wird wären hilfreich.

cu