# Datei speichern mittels InputStream



## magic_halli (20. Mrz 2008)

Hi,

ich möchte aufgrund eines vorhandenen InputStream eine Datei erstellen und speichern. Der InputStream kommt von einer Datei, die als Attachement an einer ausgelesenen Mail hängt.
Ich habe aber irgendwie ein Problem mit der Umsetzung vom InputStream hin zum letztendlichen Speichern der Datei! (Denkfehler oder fehlerhafter Programmablauf?). Hier mal die Funktion, die eine Datei aus dem InputStream machen/speichern soll:

```
private static void saveFile(String filename, InputStream inputStr){
		
		try{			
			InputStreamReader inReader = new InputStreamReader(inputStr);
			BufferedReader buffReader = new BufferedReader(inReader);
			String read = buffReader.readLine();
			
			StringBuffer strBuffer = new StringBuffer();
			while ( read != null) {
				strBuffer.append(read);
			}
			BufferedWriter buffWriter = new BufferedWriter( new FileWriter("/home/hallbauer/workspace/tmp/" + filename) );
			buffWriter.write(strBuffer.toString());
			buffWriter.close();
			
		}catch(Exception err){
			System.out.println(err);
		}
	}
```
Was habe ich hier falsch gemacht?

Danke und Gruß


----------



## The_S (20. Mrz 2008)

Also zuersteinmal verwendest du hier Reader und Writer. Diese sind für Text gedacht. Dateien sind aber binär, deshalb musst du Streams verwenden.


----------



## Leroy42 (20. Mrz 2008)

...und zweitens wirst du dir mit

```
while ( read != null) { 
            strBuffer.append(read); 
         }
```

schnell eine OutOfMemoryException einfangen, wenn read zu Beginn  != null ist


----------



## magic_halli (20. Mrz 2008)

Mh, ich lese jetzt schon ne Weile im Buch... aber irgendwie ist das sehr konfus beschrieben (leider auch ohne Code)!

Also ich habe meinen InputStream. Diesen übergebe ich an den InputStreamReader, der diesen dann quasi einliest?!

```
private static void saveFile(String filename, InputStream inputStr){
      InputStreamReader inReader = new InputStreamReader(inputStr);
      ...
      //hier dann OutputStreamReader und OutputStream...
      //...um schließlich in eine neue Datei mit 'filename' zu speichern
}
```

Dann brauche ich den ganzen Zirkus mit BufferedReader und BufferedWriter nicht, sonder nehme stattdessen einen OutputStreamReader und OutputStream, um die Daten aus dem InputStreamReader in ein File zu speichern?! Habe ich das richtig verstanden/interpretiert?
Mir ist noch nicht klar, wie ich die Verbindung vom Input zum Output herstelle.

Habt ihr mal ne Quelle mit Codebeispielen zur Hand, damit ich das mal sehe?


----------



## The_S (20. Mrz 2008)

Wie der Name vermuten lässt, handelt es sich bei einem InputStream*Reader* ebenfalls um einen Reader und bei einem OutputStream*Writer* ebenfalls um einen Writer ...

Ich will mal nicht so sein:


```
private static void saveFile(String filename, InputStream inputStr) throws IOException {
   FileOutputStream fos = new FileOutputStream(filename);
   int temp = -1;
   while ((temp = inputStr.read()) != -1) {
      fos.write(temp);
   }
   fos.close();
}
```

(ungetestet)


----------



## magic_halli (20. Mrz 2008)

Cool, jetzt klappt das endlich... ich hab da echt etwas zu kompliziert  gedacht!

Danke


----------



## The_S (20. Mrz 2008)

is jetzt aber nicht wirklich die performanteste lösung, aber wenns dir genügt, dann passts ja


----------



## magic_halli (20. Mrz 2008)

Hobbit_Im_Blutrausch hat gesagt.:
			
		

> is jetzt aber nicht wirklich die performanteste lösung, aber wenns dir genügt, dann passts ja



Ach, wieso das denn - was wäre denn performanter bzw. würde sich eine performantere Lösung sehr bemerkbar machen?


----------



## The_S (20. Mrz 2008)

Kommt auf die größe der Datei an bzw. die Datenmenge des Streams. Schneller geht es z. B. mit gepufferten Streams oder mit den Klassen aus dem java.nio package.


----------



## magic_halli (20. Mrz 2008)

Naja, so ein Mailanhang kann schonmal paar MB´s haben!
Wenn dann ein Postfach zum ersten mal ausgelesen wird, sind bestimmt mal 50 Mails, teilweise mit Anhang, drin. Ich will das ja erst noch so basteln, dass nur neue (ungelesene) Mails abgeholt werden... aber das wird sicher ein extra Post werden?!  :wink: 

Macht sich dann zeittechnisch gesehen die Nutzung von gepufferten Streams sehr bemerkbar?


----------



## The_S (20. Mrz 2008)

ja


----------



## magic_halli (20. Mrz 2008)

Wahnsinn.... Habe das jetzt mal gepuffert probiert - das sind ja Welten!

```
FileOutputStream fos = new FileOutputStream(filename);
BufferedOutputStream bos = new BufferedOutputStream(fos);

BufferedInputStream bis = new BufferedInputStream(inputStr);
int aByte;
while ((aByte = bis.read()) != -1) {
     bos.write(aByte);
}
bos.flush();
bos.close();
bis.close();
```

Gruß


----------



## The_S (20. Mrz 2008)

das bos.flush am ende kannst dir sparen, bos.close erledigt auch gleichzeitig ein bos.flush.


----------



## magic_halli (20. Mrz 2008)

Vielen Danke für die Hilfe.

Gruß


----------

