# FileInputStream und ObjectInputStream



## Stevvieboy (22. Nov 2010)

Hallo,

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

hier ein beispiel


```
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 (22. Nov 2010)

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 (22. Nov 2010)

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:


```
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 (22. Nov 2010)

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 (23. Nov 2010)

Hallo,

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


```
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:


```
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... (23. Nov 2010)

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 (23. Nov 2010)

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:

```
ObjectOutputStream os=new ObjectOutputStream(new FileOutputStream(".auto.txt"));
```
Du willst also ein Object in eine Datei schreiben. *Object*OutputStream macht dir aus dem Object ein Haufen 0 und 1. Dann kommt der *File*OutputStream 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 (23. Nov 2010)

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 (23. Nov 2010)

XHelp hat gesagt.:


> 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:
> 
> ...



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.


----------



## XHelp (23. Nov 2010)

OOS > FOS > Datei... Einlesen geht rückwärts. Ließt den Satz einfach von hinten, dann hast du eine Erklärung.


----------



## Stevvieboy (23. Nov 2010)

okay top  ich geh mal schlafen und schau mir das ganze nochmals morgen genauer an. Danke nochmals


----------



## Stevvieboy (23. Nov 2010)

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

was passiert hier genau:


```
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 (23. Nov 2010)

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


----------



## Stevvieboy (23. Nov 2010)

XHelp hat gesagt.:


> 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 (23. Nov 2010)

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 (23. Nov 2010)

edit


----------



## Michael... (23. Nov 2010)

Stevvieboy hat gesagt.:


> macht es hier überhaupt sind datainput/dataoutputstream zu nutzen wenn wir hier nur einen String versenden bzw empfangen. Wie würdet ihr das am besten machen .....


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


----------



## Stevvieboy (23. Nov 2010)

Michael... hat gesagt.:


> 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 ?


----------



## Michael... (23. Nov 2010)

Stevvieboy hat gesagt.:


> 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.


----------

