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
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
M Frage zur Methode split der Klasse String Java Basics - Anfänger-Themen 32
M Frage zu printWriter Java Basics - Anfänger-Themen 5
C Frage zu OLSMultipleLinearRegression Java Basics - Anfänger-Themen 31
KogoroMori21 Frage zum Euklidischen Algorithmus Java Basics - Anfänger-Themen 11
S Verständnis-Frage zu einer HÜ? Java Basics - Anfänger-Themen 1
L Frage zur Ticket Maschine Java Basics - Anfänger-Themen 1
J Frage zu OOP-Klassendiagramm Java Basics - Anfänger-Themen 8
OSchriever Frage zu Compiler Java Basics - Anfänger-Themen 8
H Frage zu Throw Exception Java Basics - Anfänger-Themen 2
Bademeister007 Hallo Leute ich hab eine Frage zur ArrayList Java Basics - Anfänger-Themen 8
F Frage betreff Programmierbücher zu Lagerverwaltung als Konsolenprogramm Java Basics - Anfänger-Themen 3
dieter000 Kurze Frage kann mir ejmand kurz diesen Code erklären, bzw wie man die zeilen erklärt und so Java Basics - Anfänger-Themen 1
I String.split regex Frage Java Basics - Anfänger-Themen 2
C Best Practice Frage zum MVC-Pattern Java Basics - Anfänger-Themen 2
dieter000 Frage zu einem Beispiel... Java Basics - Anfänger-Themen 5
J Frage zum Loggen Java Basics - Anfänger-Themen 18
J Methoden Frage: Array-Werte in anderer Methode ändern Java Basics - Anfänger-Themen 4
JD_1998 Array-Position aus einer Methode in einer anderen ausgeben (Kurze Frage) Java Basics - Anfänger-Themen 2
marcooooo Frage zu bestimmten Beispiel Java Basics - Anfänger-Themen 31
NeoLexx equals()-Methode Verständnis Frage anhand Code Beispiel Java Basics - Anfänger-Themen 22
N Input/Output Eine Frage über system.out.println. Java Basics - Anfänger-Themen 10
B Erste Schritte Learning Coding (!) Frage an erfahrene Programmierer. Java Basics - Anfänger-Themen 23
M konzeptuelle Frage: In welcher Klasse definiert man am Besten Methoden, die die Kommunikation mit dem User regeln? Java Basics - Anfänger-Themen 8

Ähnliche Java Themen


Oben