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