2009-06-26 9 views
3

Ich habe eine Methode, die eine Datei öffnet und an eine andere Funktion übergibt, um einige Daten darauf zu schreiben. Diese zweite Methode möchte PrintWriter verwenden, um seine Daten zu schreiben. Ich wollte jedoch nicht, dass jeder PrintWriter verwendet, um in diesen Stream zu schreiben.Wechseln von Writern auf einem OutputStream in Java

Derzeit sieht es so etwas wie dieses (hygienisiert Beispiel ... nicht die Mühe, meine Wahl der Methode zu kritisieren oder Variablennamen)

public void exportRawDataIntoStream(OutputStream os) { 
    PrintWriter pr = new PrintWriter(os); 
    printFirstData(pr); 
    printSecondData(pr); 
} 

public void exportToFile(File file) { 
    OutputStream os = null; 
    try { 
     os = new BufferedOutputStream(new FileOutputStream(file)); 
     exportRawDataIntoStream(os); 
       doMoreWithTimeFile(os); 
    } finally { 
     if (os != null) { 
      try { 
       os.close(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

Dies funktioniert nicht, wenn ich nicht eine ‚pr.flush setzen 'am Ende des ExportsRawDataIntoStream. Ich kann den PrintWriter nicht schließen, weil dadurch der gesamte Stream geschlossen wird.

Ist das Spülen legitim und zuverlässig? Gibt es einen anderen Ansatz, den ich verwenden sollte, um Writer im gleichen Stream zu mischen, oder sollte ich das absolut nie tun?

Antwort

4

Ja, Spülen sollte zuverlässig sein. Es ist die grundlegende Rolle, überschüssige Daten "mitzunehmen".

Allerdings, um fair zu sein, das wird nur mit Ihren grundlegenden Writers funktionieren. Denken Sie, das ist das meiste, wenn nicht alles von ihnen.

Aber betrachten Sie einige erfundene besondere Art von Schriftsteller. Etwas, das "etwas anderes tut". Wie ein Verschlüsselungs- oder Komprimierungsstrom.

Angenommen, Sie hatten einen "Base64 Encoder Writer", es kann das möglicherweise nachgestellte "==" nicht sicher schreiben, bis es FERTIG ist, und das ist ein Schließen, kein Flush.

Aber mit diesem Vorbehalt, für Ihren Fall mit dem PrintWriter, sollte es kein Problem sein.

+0

Beachten Sie auch, dass Implementierungen von Writers und OutputStreams, die andere Streams umschließen, davon abhängen, ob close() den zugrunde liegenden Stream tatsächlich schließt. In einigen Fällen können Sie möglicherweise close() aufrufen, wenn Sie wissen, dass der zugrunde liegende Stream nicht geschlossen wird. – JimN

+0

Dinge wie Kompressionsströme haben typischerweise eine finish() - Methode oder ähnliches, um die Ausgabe zu beenden, ohne den zugrunde liegenden Stream zu schließen. –

+0

Ja, das war immer ein Punkt der Verwirrung. Es ist mein Verständnis, dass "nahe" die gesamte Kette schließen soll, aber wie du sagst, tun manche, manche nicht. –

Verwandte Themen