FileInputStream und ObjectInputStream

Stevvieboy

Mitglied
Hallo,

ich habe eine Verständnisfrage. Wieso wird beim Einlesen und Speichern FileInputStream/FileOutputstream und ObjectInputStream/ObjectOutputStream genutzt.

hier ein beispiel

Java:
private void save (Auto auto) {
    try {
      String datei = ".auto.txt";
      FileOutputStream fis= new FileOutputStream(datei); 
     ObjektOutputStream os=new ObjektOutputStream(fis);

      objectOutputStream.writeObject(auto);
      objectOutputStream.flush();
      objectOutputStream.close();
    } catch (Exception e) {
      e.printStackTrace();
  }



public Auto laden(String nr) {
    try {
      String datei = nr+ ".txt";
      FileInputStream fis= new FileInputStream(datei); 
      ObjectInputStream is=new ObjektInputStream(fis)

      Auto auto = (Auto) objectInputStream.readObject();

      objectInputStream.close();
      return auto;
    } catch (Exception e) {
      e.printStackTrace();
                } 
    return null;
  }

kann mir jemand bei dieser Frage helfen. Ich bräuchte eine ausführliche verständliche Erklärung :). Habt ihr vielleicht eine gute auf deutsch erklärenende Seite :) ?

ich bedanke mich schon vielmals im voraus

Gruss

Stevie
 

XHelp

Top Contributor
Was genau meinst du damit?
Beim Lesen brauchst du halt Eingabe=Input, deswegen benutzt du auch InputStreams.
Beim Schreiben erzeugst du Ausgabe=Output, deswegen benutzt du auch OutputStreams.
 

Stevvieboy

Mitglied
Hallo meine Frage war wieso hier dem ObjectInputStream und ObjectOutputStream die referenzvariable von FileInputStream bzw FileOutputStream gegeben wird.

Wieso funktioniert es nicht z.B so:

Java:
private void save (Auto auto) {
    try {
      String datei = ".auto.txt";
          ObjektOutputStream os=new ObjektOutputStream(datei);
 
      objectOutputStream.writeObject(auto);
      objectOutputStream.flush();
      objectOutputStream.close();
    } catch (Exception e) {
      e.printStackTrace();
  }
 
 
 
public Auto laden(String nr) {
    try {
      String datei = nr+ ".txt";
      
      ObjectInputStream is=new ObjektInputStream(datei)
 
      Auto auto = (Auto) objectInputStream.readObject();
 
      objectInputStream.close();
      return auto;
    } catch (Exception e) {
      e.printStackTrace();
                } 
    return null;
 

XHelp

Top Contributor
Weil die Klassen so nicht aufgebaut sind?
Du hast eine Datei, aus der du lesen willst, also baust du ein FileStream drumherum. Aus diesem Stream willst du jetzt ein Objekt lesen, also baust du ein ObjectStream drumherum.
 

Stevvieboy

Mitglied
Hallo,

ich habe eine bitte an dich: wenn du nicht helfst verstehe ich dich :( ...weil ich wohl nerve.

Java:
private void save (Auto auto) {
    try {
      String datei = ".auto.txt";
      FileOutputStream fis= new FileOutputStream(datei); 
     ObjektOutputStream os=new ObjektOutputStream(fis);
 
      objectOutputStream.writeObject(auto);
      objectOutputStream.flush();
      objectOutputStream.close();
    } catch (Exception e) {
      e.printStackTrace();
  }

kannst du mir genau sagen was das macht
FileOutputStream fis= new FileOutputStream(datei);
ObjektOutputStream os=new ObjektOutputStream(fis);

ist das eine Streamsverkettung? wie wird hier verkettet? wer speichert jetzt die Datei? objektOutputStream oder FileOutputStream? du würdest mir sehr helfen wenn du mir das genau erläuterst. Ich muss das gut erläutert in meiner Doku beschreiben. Würde mich sehr freuen das gleiche gilt anolog für das lesen:

Java:
public Auto laden(String nr) {
    try {
      String datei = nr+ ".txt";
      FileInputStream fis= new FileInputStream(datei); 
      ObjectInputStream is=new ObjektInputStream(fis)

wenn du keine lust hast ...kannst du mir eine gut quelle geben damit ich mir das da zusammenschreiben kann :)

vielen dank das du dir die mühe machst mir zu helfen.
 

Michael...

Top Contributor
Wenn Du auf die Links zu ObjectOutputStream und FileOutputStream in Deinem Code klickst, bekommst Du schon mal eine grundlegende Beschreibung der Klasse.
Aber prinzipiell hat XHelp das wesentliche schon gesagt.
Mit FileOutputStream öffnet man einen Stream mit dem man - was man will - in eine Datei schreiben kann.
Mit einem ObjectOutputStream kann man serialisierbare Objekte in beliebige Streams schreiben. (s. Stichwort Serialisierung / Zustandsspeicherung von Objekten)
In dem man einem ObjectOutputStream einen FileOutputStream im Konstruktor übergibt, teil man dem OOS mit die Objekte in den FileStream zu schreiben, der diese wiederum in die Datei schreibt.

Gleichtes gilt für die InputStreams, die zum Lesen von Streams verwendet werden.
 

XHelp

Top Contributor
Kannst dich ja durch Java ist auch eine Insel – 12 Datenströme und Dateien durchlesen, da steht es bestimmt genauer erklärt.
Ob jetzt nun Output oder Input, der Grundidee ist die selbe, die Richtung ist nur anders.
Vllt wird es durch diese Schreibweise deutlicher:
Java:
ObjectOutputStream os=new ObjectOutputStream(new FileOutputStream(".auto.txt"));
Du willst also ein Object in eine Datei schreiben. ObjectOutputStream macht dir aus dem Object ein Haufen 0 und 1. Dann kommt der FileOutputStream ins Spiel, nimmt diese 0 und 1 und schreibt die in eine Datei.
Du hast ein Euro-Stecker, aber eine US-Steckdose. So ganz ohne weiteres passt das nicht. Also brauchst du noch ein Zwischenstück, der Euro-Stecker als Input bekommt und US-Stecker als Output hat.
 

Stevvieboy

Mitglied
Hallo,

vielen Danke michael :) .....langsam versteh ich es also nochmals zur Verdeutlichung:

1. FileOutpustream brauchen wir um in eine Datei zu schreiben mit dem namen "auto.txt"
2. ObjectInputStream schreibt die serialisierte objecte in das FileOutputStream dieser wiederum speichert sie dann am Ende in die .txt datei...habe ich das so richtig verstanden ? oder ist das falsch ......

also die methode:
objectOutputStream.writeObject(auto);
schreibt dann die serialisierte objekte bzw serialisierte object in das fileoutputstream, im hintergrund wird dann noch fis.write() ausgeführt, was wir nicht sehen .....

wie funktioniert das dann beim lesen ? wer macht was zuerst :), wie ist der Ablauf? Kannst du mir das auch noch bitte erklären....ich wäre dir sehr sehr dankbar.
 

Stevvieboy

Mitglied
Kannst dich ja durch Java ist auch eine Insel – 12 Datenströme und Dateien durchlesen, da steht es bestimmt genauer erklärt.
Ob jetzt nun Output oder Input, der Grundidee ist die selbe, die Richtung ist nur anders.
Vllt wird es durch diese Schreibweise deutlicher:
Java:
ObjectOutputStream os=new ObjectOutputStream(new FileOutputStream(".auto.txt"));
Du willst also ein Object in eine Datei schreiben. ObjectOutputStream macht dir aus dem Object ein Haufen 0 und 1. Dann kommt der FileOutputStream ins Spiel, nimmt diese 0 und 1 und schreibt die in eine Datei.
Du hast ein Euro-Stecker, aber eine US-Steckdose. So ganz ohne weiteres passt das nicht. Also brauchst du noch ein Zwischenstück, der Euro-Stecker als Input bekommt und US-Stecker als Output hat.

Vielen dank ihr zwei seid top :) wie könnte man das beim lesen erläutern ...wenn ihr mir da noch hilft....bin ich euch sehr dankbar.
 

Stevvieboy

Mitglied
Sry das ich nochmals nerve....da wir schon beim thema sind und ich das als nächstes Fragen wollte.

was passiert hier genau:

Java:
Socket sock=new Socket("localhost", 1555);
InputStream in=sock.getInputStream();    // ruft den zulesenden eingabestrom von sock ab 
OutputStream out=sock.getOutputStream(); 
DataInputStream dis=new DataInputStream(in);
DataOutputStream dos=new DataOutputStream(out);

Zeile 1 -3 verstehe ich

nur bei 4 und 5 habe ich meine Problem. Das ist wirklich die letzte Frage zu diesem Themengebiet ....ich hoffe ihr könnt mir hier wieder helfen.
 

XHelp

Top Contributor
Selbe Erklärung. Ersetze "Datei" durch Socket, "FileOutputStrem" durch OutputStream und "ObjectOutputStream" durch DataOutputStream.
 

Stevvieboy

Mitglied
Selbe Erklärung. Ersetze "Datei" durch Socket, "FileOutputStrem" durch OutputStream und "ObjectOutputStream" durch DataOutputStream.
hier ist das doch irgendwie wegen 2 byte und 1 byte oder :) ? ist glaub anders ......da wird doch irgendwie 2 byte in 1 byte konveritert. Was macht dataoutputstream in welchen form bringt er die dateien damit outputstream es lesen bzw schreiben kann .....
 

XHelp

Top Contributor
Das hat mit 2 oder 1 Byte nichts zu tun (was auch immer du damit meinst). Beim ObjectOutputStream schreibst du Objekte. Beim DataOutputStream schreibst du Daten. Ich meinte nicht umsonst, dass die erklärung die selbe bleibt. Guck doch einfach in die Api rein, dann siehst du, WAS da geschrieben werden kann.
 

Stevvieboy

Mitglied
Warum nicht? Welche Klassen man zum Lesen und Schreiben in Socketstreams verwendet, hängt u.a. auch von verwendeten Kommunikationsprotokoll ab.

hallo,

also macht hier datainputstream bzw dataoutputstream sinn :) hab grad lange im Internet gesucht aber irgendwe nichts gefunden.

Ich gebe über oberfläche ein String aus dieser wird dann von einer "Streamklasse" genommen und an den server weitergegeben...der nimmt das führt paar tätigkeiten aus und schickt mir wieder ein String zurück, welches ich dann auch in der GUI anzeigen muss.

Hier macht das also DataInput/Dataoutpustream sinn? für schreiben und lesen habe ich mir writeUTF und readUTF gedacht? ist das so richtig?


nochmals zu meiner vestänidnisfragen was passsiert da zwischen InputStream und DataInputStream...dataOutputstream muss doch die daten irgenwie konverteiren bevor es Outputstream schreiben bzw verstehenkann oder verstehe ich das falsch ?
 
Zuletzt bearbeitet:

Michael...

Top Contributor
nochmals zu meiner vestänidnisfragen was passsiert da zwischen InputStream und DataInputStream...dataOutputstream muss doch die daten irgenwie konverteiren bevor es Outputstream schreiben bzw verstehenkann oder verstehe ich das falsch ?
Das ist ja in den jeweiligen Klassen entsprechend implementiert. Daher brauchst Du Dich nicht mehr darum kümmern.
Wenn Du einen String per writeUTF in einen Stream schreibst, weiss der DataStream wie die einzelnen Buchstaben binär codiert werden müssen. Und da Du auf der anderen Seite mit readUTF wieder einliest, ist gewährleistet, dass da das gleiche rauskommt was auf der anderen Seite in den Stream geschrieben wurde.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D new ObjectInputStream(socket.getInputStream()); Netzwerkprogrammierung 15
G ObjectOutputStream und ObjectInputStream machen Ärger Netzwerkprogrammierung 17
F ObjectInputStream.readObject() mehrfach aufrufen Netzwerkprogrammierung 2
J ObjectInputStream im Netzwerk Netzwerkprogrammierung 8
K ObjectInputStream EOF Netzwerkprogrammierung 6
G ObjectInputStream hängt ganzes Programm auf... Netzwerkprogrammierung 7
X ObjectInputStream StringCorruptedException Netzwerkprogrammierung 3
V StreamCorruptedException bei ObjectInputStream und ObjectOStream Netzwerkprogrammierung 5
C Socket ObjectInputStream liest nur Objekte der jeweiligen Programminstanz Netzwerkprogrammierung 5
M InputStream and ObjectInputStream zur gleichen Zeit Netzwerkprogrammierung 11
J Socket ObjectInputStream prüfen Netzwerkprogrammierung 8
N Socket neue Referenz auf ObjectInputStream Netzwerkprogrammierung 13
E Rausfinden ob noch Objecte in ObjectInputStream Netzwerkprogrammierung 5
Y Problem mit ObjectInputStream beim lesen vom Socket Netzwerkprogrammierung 10
C komisches Problem / ObjectInputStream erstellt sich nicht Netzwerkprogrammierung 5
K ObjectInputStream mit CypherInputStream hängt Netzwerkprogrammierung 7
G Datei über ObjectInputStream versenden Netzwerkprogrammierung 8
R ObjectOutput- / ObjectInputStream Exception? Netzwerkprogrammierung 2
E ObjectInputStream/ObjectOutputStream nicht erzeugbar Netzwerkprogrammierung 2
T Problem mit ObjectInputStream Netzwerkprogrammierung 2
C Kollision von ObjectInputStream und BufferedReader ? Netzwerkprogrammierung 6
G ObjectInputStream gebuffert? Netzwerkprogrammierung 3

Ähnliche Java Themen


Oben