tutorials.de Buch-Aktion 05/2012
Like Tree1Danke
  • 1 Beitrag von takidoso
ERLEDIGT
NEIN
ANTWORTEN
6
ZUGRIFFE
5847
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    DarthShader DarthShader ist offline Mitglied Platin
    Registriert seit
    May 2004
    Beiträge
    684
    Hallo,

    ich komme immer wieder ins Schleudern, wenn es um diese ganzen verschiedenen IO Klassen geht, wie PrintWriter, die Buffered Stream Klassen etc... oft weiß ich nicht, welche Klasse ich am besten einsetze.

    Ich habe nun die Situation, dass es eine Methode gibt, innerhalb derer ich einen String in den übergebenen OutputStream schreiben möchte.

    Das sieht folgendermaßen aus:

    Code java:
    1
    2
    3
    4
    5
    6
    
    public void write( OutputStream out )
    {
        PrintWriter pw = new PrintWriter( out );
        pw.println( "Hello World" );
        pw.flush();
    }

    Mir stellt sich nun die Frage, warum ich pw.flush() machen muss (in einem Testprogramm ist der übergebene OutputStram "System.out" und ich sehe "Hello World" erst auf der Konsole, wenn ich pw.flush() aufrufe). Ist denn der PrintWriter auch gepuffert, obwohl es dafür extra BufferedXXX Klassen gibt?

    Ist der code oben denn gut so? Oder sollte ich lieber einen BufferedWriter für soetwas verwenden, wie folgt:

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    public void write( OutputStream out )
    {
        BufferedWriter bw = new BufferedWriter( new PrintWriter(out ) );
        
        try
        {
            bw.write( "Hello World!" );
            bw.flush();
        }
        catch ( IOException e ) { e.printStackTrace(); }
    }

    Hier habe ich den PrintWriter durch einen BufferedWriter gewrappt. Um die Ausgabe auf der Konsole zu sehen, muss ich wieder bw.flush() machen. Das kann ich aber verstehen, der die Ausgabe wird ja gepuffert. Aber warum muss ich denn bei einem BufferedWriter eine IOException abfangen, und beim PrintWriter nicht?


    Ist das 2. Codebeispiel besser, oder gibt es einen noch anderen Weg, quasi eine Best Practice? Wie würdet Ihr die Geschichte lösen?


    Danke für Eure Hilfe!
     

  2. #2
    Avatar von vfl_freak
    vfl_freak vfl_freak ist offline Mitglied Diamant
    Registriert seit
    Aug 2007
    Ort
    Niedersachsen
    Beiträge
    2.161
    Hallo,

    also nach meinem Kenntnisstand kann man sich beim PrintWriter in der Tat die flush()-Anweisung sparen (im Gegensatz zum BufferedWriter).

    Aber verstehe ich das jetzt richtig, dass es ohne das flush() im ersten Beispiel gar nicht funktioniert

    tschüss
    Klaus
    Geändert von vfl_freak (16.07.08 um 17:07 Uhr) Grund: leidige Tippfehler ;-))
     
    Es ist noch kein Meister vom Himmel gefallen - sonst hätte man schon längst seine Leiche gefunden !!

    Falls ich helfen konnte, wäre eine Bewertung oder ein Danke nett ;-)
    -------------------------------------------------------------------------------------------------
    Ich beantworte keine Fragen per PN !!
    Stellt Eure Fragen im Forum - dann haben alle etwas davon !!

  3. #3
    Avatar von takidoso
    takidoso takidoso ist offline Mitglied Brillant
    Registriert seit
    Aug 2004
    Ort
    Kömigstein
    Beiträge
    911
    Also das zu Beantworten warum Flush beim PrintWriter gibt der Sourcecode sehr guten Aufschluß

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    
     
    ...
        public PrintWriter(OutputStream out) {
        this(out, false);
        }
     
        /**
         * Creates a new PrintWriter from an existing OutputStream.  This
         * convenience constructor creates the necessary intermediate
         * OutputStreamWriter, which will convert characters into bytes using the
         * default character encoding.
         *
         * @param  out        An output stream
         * @param  autoFlush  A boolean; if true, the <tt>println</tt>,
         *                    <tt>printf</tt>, or <tt>format</tt> methods will
         *                    flush the output buffer
         *
         * @see java.io.OutputStreamWriter#OutputStreamWriter(java.io.OutputStream)
         */
        public PrintWriter(OutputStream out, boolean autoFlush) {
        this(new BufferedWriter(new OutputStreamWriter(out)), autoFlush);
        // save print stream for error propagation
        if (out instanceof java.io.PrintStream) { 
            psOut = (PrintStream) out;
        }
        }
     
    ...

    Der Konstruktor, wie zu erkennen, verwendet bereits einen BufferedWriter. In der Einfachen Variante ohne Autoflush wird ein false als Default genommen!

    Takidoso

    PS: Die IO-Klassen sind in mancher Beziehung heftig viele. So ein Vererbungsbaum, den ich mal irgendwo in einem Buch gesehen hatte half meinem Verständnis in der ein oder anderen Weise gut auf die Sprünge.
    vfl_freak bedankt sich. 

  4. #4
    Avatar von vfl_freak
    vfl_freak vfl_freak ist offline Mitglied Diamant
    Registriert seit
    Aug 2007
    Ort
    Niedersachsen
    Beiträge
    2.161
    Hallo Takidoso,

    ein guter Hinweis - Danke !!
    Das war mir so auch nicht klar

    Habe eben mal die Sourcen der Projekte durchsucht, die ich hier vor einiger Zeit übernommen habe. Es gab nur eine einzige Stelle - und da wurde dann wohl auch genau dieses Autoflush verwendet .....

    tschüss
    Klaus
     
    Es ist noch kein Meister vom Himmel gefallen - sonst hätte man schon längst seine Leiche gefunden !!

    Falls ich helfen konnte, wäre eine Bewertung oder ein Danke nett ;-)
    -------------------------------------------------------------------------------------------------
    Ich beantworte keine Fragen per PN !!
    Stellt Eure Fragen im Forum - dann haben alle etwas davon !!

  5. #5
    Avatar von takidoso
    takidoso takidoso ist offline Mitglied Brillant
    Registriert seit
    Aug 2004
    Ort
    Kömigstein
    Beiträge
    911
    Zitat Zitat von DarthShader Beitrag anzeigen
    Hallo,

    Ist das 2. Codebeispiel besser, oder gibt es einen noch anderen Weg, quasi eine Best Practice? Wie würdet Ihr die Geschichte lösen?


    Danke für Eure Hilfe!
    Also Ich würde das erste Codebeispiel bevorzugen, da ich dem Sourcecode zur Folge im 2. Beispiel IMHO einen doppelten Puffer haben müsste, oder?
     

  6. #6
    DarthShader DarthShader ist offline Mitglied Platin
    Registriert seit
    May 2004
    Beiträge
    684
    Zitat Zitat von takidoso Beitrag anzeigen
    Also Ich würde das erste Codebeispiel bevorzugen, da ich dem Sourcecode zur Folge im 2. Beispiel IMHO einen doppelten Puffer haben müsste, oder?
    Ja, das denke ich auch. Ich baue da im 2. Beispiel einen Buffer drum, aber der PritnWriter selbst baut auch nochmal einen Buffer, das ist sicher überflüssig. Das autoFlush habe ich total übersehen, danke für den Hinweis

    Ich bin mir allgemein recht unsicher, was ich genau für IO Klassen nehme. Immer wenn es im Input/Ouput geht, sehe ich mich durch die API suchen, was ich nun für Klassen nehme. Kennt vielleicht jemand eine Seite, wo genau diese Thematik mal aufgedröselt ist?

    Danke
     

  7. #7
    Avatar von vfl_freak
    vfl_freak vfl_freak ist offline Mitglied Diamant
    Registriert seit
    Aug 2007
    Ort
    Niedersachsen
    Beiträge
    2.161
    Hi,

    vielleicht hilft Dir ja Kapitel 13 im Online-Buch unter diesem Link :

    http://www.tutego.com/javabuch/online.htm

    tschüss
    Klaus
     
    Es ist noch kein Meister vom Himmel gefallen - sonst hätte man schon längst seine Leiche gefunden !!

    Falls ich helfen konnte, wäre eine Bewertung oder ein Danke nett ;-)
    -------------------------------------------------------------------------------------------------
    Ich beantworte keine Fragen per PN !!
    Stellt Eure Fragen im Forum - dann haben alle etwas davon !!

Ähnliche Themen

  1. Antworten: 3
    Letzter Beitrag: 31.08.10, 21:14
  2. Antworten: 6
    Letzter Beitrag: 15.03.10, 17:26
  3. Antworten: 2
    Letzter Beitrag: 01.10.08, 14:51
  4. C#, XML komfortabel in einen String schreiben
    Von SpAder im Forum .NET Datenverwaltung
    Antworten: 3
    Letzter Beitrag: 30.09.06, 10:57
  5. Variable verwenden anstatt Pointer auf einen String
    Von ArmerStudent im Forum VisualStudio & MFC
    Antworten: 5
    Letzter Beitrag: 05.06.05, 10:10