Input/Output Frage zu Java IO

RawRaven

Mitglied
Ich habe eine kleine Frage zu Java IO. Und zwar möchte ich den Objekt Inhalt einer Liste in einer Datei speicher (Klartext). Dafür habe ich folgenden Code:

[CODE lang="java" title="In Datei Speichern"]public void safeInTxt() {
try(FileOutputStream fos = new FileOutputStream(new File("Test"))) {
for(Medium medium : medien) {
medien.druckeDaten(fos);
}
} catch(IOException e) {
//TODO
}
}[/CODE]

Und in der Klasse Medium:

[CODE lang="java" title="druckeDaten"]public void druckeDaten(Outputstream os) {
PrintStream ps = new PrintStream(os);
ps.println(this);
ps.flush();
}[/CODE]

Normalerweise soll man einen Stream ja immer schließen, jedoch ist das hier nicht möglich, da sonst der PrintStream auch den OutputStream schließt. Deshalb wollte ich fragen, ob es in einer solchen Situation in Ordnung ist den PrintStream nicht zu schließen, oder ob das einfach eine grundsätzlich schlechte Lösung ist. :D
 

sascha-sphw

Top Contributor
Wenn Du in der Methode druckeDaten doch eh nur this übergibst, warum nicht so? Warum muss das Medium den PrintStream und Outputstream überhaupt kennen?
Java:
public void safeInTxt() {
    try(FileOutputStream fos = new FileOutputStream(new File("Test"))) {
        PrintStream ps = new PrintStream(fos);
        for(Medium medium : medien) {
            ps.println(medium);
        }
        ps.flush();
    } catch(IOException e) {
        //TODO
    }
}
 

RawRaven

Mitglied
Das hat mich auf verwirrt. Aber die Aufgabenstellung war so gestellt, dass die Klasse Medium eine Methode druckeDaten(OutputStream os) beinhaltet.
 
K

kneitzel

Gast
Als erstes zu dem Code von @sascha-sphw:
a) PrintStream hat einen Konstruktor, der ein File nimmt, FileOutputStream braucht es nicht.
b) close() macht auch ein Flush, daher ist ein expliziter flush Aufruf nicht notwendig.
Java:
public void safeInTxt() {
    try(PrintStream ps = new PrintStream(new File("Test"))) {
        for(Medium medium : medien) {
            ps.println(medium);
        }
    } catch(IOException e) {
        //TODO
    }
}

Bezüglich der Fragen von @RawRaven:
a) Du schliesst nur Dinge, die Dir "gehören". Etwas, das dir nur übergeben wird, hast Du in der Regel nicht zu schließen. Daher ja: Du hast den Stream, den Du als Parameter bekommen hast, nicht zu schließen.
b) PrintStream implementiert AutoClosable. Und Du erzeugst die Instanz. Daher sollte diese Instanz, die Dir gehört, tatsächlich geschlossen werden.
Wie Du sehr gut erkannt hast, beißen sich diese Regeln. Daher ist hier in der Regel eine Änderung notwendig. Also z.B. diesen als Parameter bereits angeben. (Denn Dein Code erfordert diesen) oder eben darauf verzichten.
 
K

kneitzel

Gast
Das hat mich auf verwirrt. Aber die Aufgabenstellung war so gestellt, dass die Klasse Medium eine Methode druckeDaten(OutputStream os) beinhaltet.
Dann wäre durchaus denkbar, den PrintStream nicht zu schließen und nur ein flush aufzurufen. Aber das ist etwas, das ich nicht gut finde.

Daher wäre es sinnvoll, sich auf die Möglichkeiten vom OutputStream zu beschränken.
-> OutputStream hat z.B. ein write(byte[])
Damit ist folgendes möglich:
-> Instanz per toString() in einen String umwandeln.
-> Dann per getBytes() oder getBytes(String charset) das Byte Array holen
-> Dieses dann in den Stream schreiben.
 

Barista

Top Contributor
Normalerweise soll man einen Stream ja immer schließen, jedoch ist das hier nicht möglich, da sonst der PrintStream auch den OutputStream schließt. Deshalb wollte ich fragen, ob es in einer solchen Situation in Ordnung ist den PrintStream nicht zu schließen, oder ob das einfach eine grundsätzlich schlechte Lösung ist.
Die Methode PrintStream#close schliesst auch den im Konstruktor übergebenen/erzeugten OutputStream.

Die beste Praxis ist IMHO den letzten (top level) Stream zu schliessen.

Damit wird auch jeder Buffer in der Hierarchie ge-flusht.

Natürlich Schliessen auf der richtigen Ebene, also auf der Ebene der Erzeugung, nicht in untergeordnet aufgerufenen Methoden.

Natürlich ist diese Lösung etwas starr, so wie Konstruktor und Destruktor für eine lokale Variable in C++.

Wenn man wünscht, so wie ein Java-Objekt, es irgendwo zu erzeugen und irgendwo (mehrfach) zu referenzieren, eventuell in verschiedenen Threads, kann man dies so nicht machen.

Aber im Gegensatz zu einem Java-Speicher-Objekt, das einfach verschwindet, muss es beim Stream ein Schliessen geben und man muss sich auf ein Geschlossen-Sein verlassen können, zum Beispiel wenn man in eine Datei unter einem temporären Namen schreibt und diese nach verlässlichem Schreiben zum endgültigen Namen umbenennt.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
F Frage betreff Programm mit dem man C++-Code in JAVA-Code übersetzen lassen kann Java Basics - Anfänger-Themen 2
TimoN11 Frage zu Java-Vererbung (Cast) Java Basics - Anfänger-Themen 5
Zrebna Frage zum "Referenzen-konzept" in Java Java Basics - Anfänger-Themen 8
G Schach in Java - Allgemeine Frage zur Architektur Java Basics - Anfänger-Themen 7
L Frage zu IntStream (Java 8) Java Basics - Anfänger-Themen 6
M Allgemeine Java-Frage anhand bspw. Eclipse Java Basics - Anfänger-Themen 4
Henri Paare Frage über Java Programmierung Java Basics - Anfänger-Themen 10
L Frage zu 32 Bit IEEE Norm in Java Java Basics - Anfänger-Themen 5
T Frage zu Java Stack Java Basics - Anfänger-Themen 5
M Frage zu HashCode Methode in Java Java Basics - Anfänger-Themen 7
J Java 8 Streams - Frage zu "reduce" Java Basics - Anfänger-Themen 6
B Frage zu iCalendar in Java Eclipse Java Basics - Anfänger-Themen 0
M Frage Long Wert in Java Java Basics - Anfänger-Themen 1
K Frage zu Bitschifting in Java Java Basics - Anfänger-Themen 3
K Java Eclipse Schiffeversenken Frage Java Basics - Anfänger-Themen 3
M Frage bzgl. Oracle Java Zertifizierung Java Basics - Anfänger-Themen 4
S Java - Client/Server mit Stomp kurze Frage Java Basics - Anfänger-Themen 0
D McDonalds - Java Projekt frage Java Basics - Anfänger-Themen 7
X Kurze Frage zu Java Doc Java Basics - Anfänger-Themen 3
N Java UML: Eine Frage zu public-Variablen Java Basics - Anfänger-Themen 19
J Java Generics - Frage zu Types Java Basics - Anfänger-Themen 2
D Erste Schritte Problem mit dem Java-Editor Eclipse [Frage] Java Basics - Anfänger-Themen 13
DaniSahne96 Frage zu Java ist auch eine Insel Java Basics - Anfänger-Themen 12
A Java Flächeninhaltsberechnung kleine Frage Java Basics - Anfänger-Themen 8
J Java Basics Frage Compiler etc Java Basics - Anfänger-Themen 12
K Frage zu Datentypfeststellung in Java Java Basics - Anfänger-Themen 2
D Frage zu der import Anweisung in Java Java Basics - Anfänger-Themen 15
K Frage zu einer Connection in Java Java Basics - Anfänger-Themen 3
A Frage zu Eventprogrammierung in Java Java Basics - Anfänger-Themen 6
D Frage zu Klausur über Java Java Basics - Anfänger-Themen 2
K Frage zu Java Spielen Java Basics - Anfänger-Themen 2
G Frage zur Spezifikation von JAVA Java Basics - Anfänger-Themen 4
S Frage zu Fließkommadarstellung in Java Java Basics - Anfänger-Themen 4
J Allgemeine Frage zu GUI´s in Java Java Basics - Anfänger-Themen 6
F Java Timer Frage Java Basics - Anfänger-Themen 14
A Eine Frage zu AWt in JAVA, wie wähle ich ein Punkt aus`? Java Basics - Anfänger-Themen 4
S Java Anfänger - Tutorial Frage Java Basics - Anfänger-Themen 10
E Frage zu Java Dokumentation / Eclipse Java Basics - Anfänger-Themen 9
T Java Tree Frage Java Basics - Anfänger-Themen 2
L Frage zu Java-Programm Java Basics - Anfänger-Themen 6
B Frage zu Java Java Basics - Anfänger-Themen 14
X Java Algorithmus Frage Java Basics - Anfänger-Themen 17
T Frage aus dem Buch JAVA ist auch eine Insel Java Basics - Anfänger-Themen 11
G generelle Frage zu Strukturierung von Java-Programmen Java Basics - Anfänger-Themen 2
A Frage zu java und MySQL Java Basics - Anfänger-Themen 3
E Java Applet Seiten wechel frage Java Basics - Anfänger-Themen 15
G Frage zum Abspeichern von Java-Klassen Java Basics - Anfänger-Themen 9
L Frage zur Verschlüsselung in java Java Basics - Anfänger-Themen 3
I Liste in Java (Chat-Frage) Java Basics - Anfänger-Themen 3
G Frage zu kleinem Java Programm Java Basics - Anfänger-Themen 4
J Java Frage zur Methode Java Basics - Anfänger-Themen 14
B [Java] Schachbrett Frage Java Basics - Anfänger-Themen 11
C Frage zu java.lang.reflect.Proxy Java Basics - Anfänger-Themen 4
J Habe gerade erst mit Java begonnen - Frage zu JTabbedPane Java Basics - Anfänger-Themen 3
M Java Design Frage Java Basics - Anfänger-Themen 2
M Frage zu Java Compiler Java Basics - Anfänger-Themen 3
G Frage zur Generic java ? Java Basics - Anfänger-Themen 9
G Frage zu Java und Interfaces Java Basics - Anfänger-Themen 7
T Newbie Frage Eine Java Anwendung fernsteuern? Java Basics - Anfänger-Themen 4
G eine Frage zur Generic Java ? Java Basics - Anfänger-Themen 8
D dumme Frage! (was heist 'import java.util.*;' ?) Java Basics - Anfänger-Themen 3
C kleines Java script mit Frage Java Basics - Anfänger-Themen 2
Zrebna Frage zu Test-Driven Development (TDD) Java Basics - Anfänger-Themen 3
I Frage Thymeleaf -> Fehler ignorieren und mit "" ersetzen? Java Basics - Anfänger-Themen 15
I Frage Thymeleaf -> Prefix / Suffix ändern? Java Basics - Anfänger-Themen 11
D Rekursions Probleme / frage Java Basics - Anfänger-Themen 4
T Frage zu Parse Java Basics - Anfänger-Themen 2
H Frage an die Profis Java Basics - Anfänger-Themen 4
J Eine konzeptionelle Frage zu OOP Java Basics - Anfänger-Themen 3
P Frage zu Rekursion und Backtracking Java Basics - Anfänger-Themen 2
H Frage zur Ausgabe Java Basics - Anfänger-Themen 4
H Frage zu arithmetischen Operationen Java Basics - Anfänger-Themen 20
F Kurze Frage zu replace() Java Basics - Anfänger-Themen 19
JavaSchmecktLecker Polymorphie Frage zur Methodenüberschreibung Java Basics - Anfänger-Themen 21
J Frage zu einem "Taschenrechner" code Java Basics - Anfänger-Themen 9
B Erste Schritte Frage zu Instanzierung und Referenzen Java Basics - Anfänger-Themen 8
DoubleM Runtime.getRuntime().exec Frage Java Basics - Anfänger-Themen 2
J Eine theoretische Frage zur Praxis - JPanel oder Canvas Java Basics - Anfänger-Themen 5
O Frage: Formaler Typbezeichner? Java Basics - Anfänger-Themen 3
I BlueJ Queue Frage für Klausur Java Basics - Anfänger-Themen 2
N Verständnis Frage zu Variablen Java Basics - Anfänger-Themen 3
N Spezielle frage zum Comparator Java Basics - Anfänger-Themen 6
L Frage zum Array Java Basics - Anfänger-Themen 1
A Frage zum UML Design Java Basics - Anfänger-Themen 1
I Hilfe bei Klausur Frage Java Basics - Anfänger-Themen 8
izoards Drucken Frage zu FAQ Beitrag Java Basics - Anfänger-Themen 2
J Frage zu meinem Code (OOP) Java Basics - Anfänger-Themen 4
sserio Split() -> Regex Frage. Java Basics - Anfänger-Themen 7
A OCA Study Guide: 2. Frage aus Kapitel 3 Java Basics - Anfänger-Themen 9
sserio Date Library Frage Java Basics - Anfänger-Themen 9
Max246Sch Frage zu Währungsrechner Code Java Basics - Anfänger-Themen 2
sserio Frage zu HashMaps Java Basics - Anfänger-Themen 20
sserio Frage zu Threading - Multithreading Java Basics - Anfänger-Themen 2
sserio Frage zu Lambda Ausdrücken Java Basics - Anfänger-Themen 7
sserio Frage zu BigInteger Java Basics - Anfänger-Themen 1
D Frage bzgl. Enum-Handhabung Java Basics - Anfänger-Themen 16
xxx12 Frage Java Basics - Anfänger-Themen 2
I Generelle Frage zu Mikroservices (Spring Boot?), Docker... Java Basics - Anfänger-Themen 7
R Frage zu Methoden (Rückgabewert u. ohne.) Java Basics - Anfänger-Themen 2
A Frage zur programmierung Java Basics - Anfänger-Themen 12

Ähnliche Java Themen

Neue Themen


Oben