[Java] Probleme mit Ein- und Auslesen von Streams

HardwarePope

Cadet 4th Year
Registriert
Feb. 2004
Beiträge
114
Hallo liebe Leute,

bin grad am Java-Basteln und habe Probleme mit der Ein- und Ausgabe mit FileWriter und InputStreamReader (bin grade am Erlernen von diesen Dingen).
Ich habe z.T. auch Musterbeispiele auf Internetseiten kopiert und selbst bei diesen tritt das Problem auf - nämlich, dass ich mit Strg-Z (bzw. bei manchen Beispielen auch Strg-C) die Eingabe nicht korrekt beenden kann, sprich, die Programmausführung läuft weiter und kommt nicht zu Ende.

Hier noch mein Quellcode:
Code:
import java.io.*;

public class FileWriteTests
{
    public static void main(String[] args)
    {
        try
        {
            File f = new File("test.txt");   // neuen DateiNAMEN erzeugen (noch nicht die Datei selbst!)
            if(!f.exists()) {
                f.createNewFile();   // neue DATEI mit dem Namen "f" erzeugen
            }
            
            Reader in = new InputStreamReader(System.in);
            
            Writer w1 = new FileWriter(f);   // festlegen, in welche Datei nachher geschrieben werden soll
            w1.write("Hallo ... ");   // der angegebene String wird in die Datei geschrieben
            w1.close();
            
            Writer w2 = new FileWriter(f, true);
            
            int c;
            while ((c = in.read()) != -1) { // lesen, auf Strom-Ende testen
                w2.write(c); // ausgeben
            }
            in.close();
            w2.close();
        }
        catch(Exception e)
        {
            System.out.println(e);
        }
    }
}

Wäre prima, wenn mir jemand mit meinem Problem helfen könnte.

Viele Grüße


HardwarePope
 
ähm hab schon seit halben jahr kein java mehr geschrieben... ne frage.. woher liest du den mit "in"? aus deine Console?

wenn es auf die eingabe von console wartet, dann bleibst du immer dort stecken wo es auf die eingabe gewartet wird. D.h. dein aktueller Thread wird unterbrochen, wobei der Reader glaube ich selbst ein eigenen thread besitzt und den hauptthread solange blockiert.... bin mir aber nicht sicher

so ma gucken... ich habe da einen "consolenreader" aus meine BA :D
Code:
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String input = in.readLine();

was bei dir vielleicht noch fehlt ist die Flush methode bei Writer. sobald du irgendwas schreibst wird es erst in den puffer geschrieben und nicht in die Datei. Versuch doch mal vor dem schließen des Writer noch zu "flushen"...

guck nach methode flush oder Flush

es muss ungefähr so aussehen
Code:
w1.flush();
somit erzwingst das schreiben der daten aus dem puffer in die Datei.... dein puffer wird glaube ich nach dem flushen geleert... naja sonst sehen ich da auch keine verwendung der alten daten die schon in die datei geschrieben worden sind.
 
Zuletzt bearbeitet:
Hallo roker002, danke erst einmal für deine Antwort.

Leider löst sie mein Problem nicht. Die Daten werden nach dem Betätigen der Strg-Z Tastenkombination tatsächlich in die Datei geschrieben - ob mit oder ohne flush().

Mein Problem ist, dass das Programm sich nicht beendet, nachdem ich Strg-Z betätigt habe und weiterläuft - es kann nur manuell, z.B. durch Schließen der Java-Konsole gestoppt werden. Wie bekomme ich es hin, dass ich den Thread beende, nachdem ich die Strg-Z Tastenkombination gedrückt habe (oder von mir aus auch mit einer anderen Tastenkombination - hauptsache, das Programm muss nicht manuell beendet werden!)

Viele Grüße

HardwarePope
 
Was passiert, wenn du statt
Code:
while ((c = in.read()) != -1) { // lesen, auf Strom-Ende testen
  w2.write(c); // ausgeben
}
das hier
Code:
while (in.ready()) {
  c = in.read();
  w2.write(c);
}
benutzt?
 
haha... natürlich wird dein programm nicht beendet, da System.in die Endlosschleife ist. Du musst entweder mit Tastenkombi und

Code:
if(input.equalsIgnoreCase("stop"))
    System.exit(0); //oder so.... keine ahnung wie es jetzt in java genau ist... mom ich gucke nach in meinen alten code. Ja es ist exit(0)

auf jeden fall kannst du den System.in nicht so einfach unterbrechen...

Musst du halt Zeilenweise auslesen und nicht pro Char aus dem Buffer.
 
Tip am Rande: Die Tastenkombination für "End of File" ist Strg+D - nicht Strg+C oder Strg+Z.
 
wie gesagt... ich kenne mich da jetzt nicht so gut aus... ist schon eine weile her!
 
Vielen Dank für die hilfreichen Antworten.

Dass System.in eine Endlosschleife ist, war mir nicht bekannt - das war letztlich der entscheidende Tip ;) (wie gesagt, ich bin gerade am Erlernen der ganzen Dinge) Meine überarbeitete Version sieht jetzt so aus:

Code:
import java.io.*;

public class FileWriteTests
{
    public static void main(String[] args)
    {
        try
        {
            File f = new File("test.txt");
            if(!f.exists()) {
                f.createNewFile();  
            }
            
            BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
            BufferedWriter w1 = new BufferedWriter(new FileWriter(f));  
            
            String z;
            while ((z = in.readLine()) != null) {
                if(z.equalsIgnoreCase("STOP")) {  
                    in.close();
                    w1.close();
                    System.out.println("\nDatei wurde geschrieben - tschüss!");
                    break; 
                }
                w1.write(z); // ausgeben
                w1.newLine();   
            }
        }
        catch(Exception e) {
            System.out.println(e);
        }
    }
}

Wegen der Tastenkombination: Strg-D und Strg-Z funktionieren beide und produzieren zumindest in meinen kurzen Tests dasselbe Resultat.

Vielen Dank und viele Grüße


HardwarePope
 
wenn du weitere tipps brauchst kannst du gerne bei java2s.com nachschauen... da sind beispiele für fast alle übliche sprachen (haha, naja nur das was ich gebraucht habe)
 

Ähnliche Themen

Zurück
Oben