# FileOutputStream -> byte[] (ohne File)



## andi24 (5. Mrz 2008)

Hallo,

ich erzeuge mir mit den Apache POI Klassen ein Excel-Dokument und übergebe dies an eine andere Klasse als byte Array (ByteArrayDataSource ). Als Rückgabeparameter der POI-Klasse erhalte ich einen FileOutputStream. Im Moment schreibe ich diesen auf die Festplatte und lese diesen dann über eine FileInputStream wieder ein. Siehe hier:


```
HSSFWorkbook excelObj;
.
File f = new File("c:\temp\anlage.xls");
FileOutputStream fileOut = new FileOutputStream(f);
excelObj.write(fileOut);
fileOut.close();

FileInputStream in = new FileInputStream(file);
BufferedInputStream reader = new BufferedInputStream(in, 4096);
int lenth = reader.available();
byte[] buf = new byte[lenth];
reader.read(buf, 0, lenth);
reader.close();
in.close();

ByteArrayDataSource bufSource = new ByteArrayDataSource(buf, "application/msexcel");
```

Geht das ganze auch ohne daß ich den Stream auf die Festplatte rauschreiben muß ?
Also quasi direkt vom FileOutputStream zum FileInputStream (oder besser als byte[]).

Danke & Gruß
Andi


----------



## Beni (5. Mrz 2008)

Wo genau erhälst du von der POI-Klasse einen FileOutputStream als Rückgabewert? In deinem Codeschnippsel steht das jedenfalls niergends...

Verwende einen ByteArrayOutputStream, der schreibt direkt ein byte-Array.


----------



## SlaterB (5. Mrz 2008)

HSSFWorkbook 
void write(java.iutputStream stream) 
          Method write - write out this workbook to an Outputstream.

das geht auch mit ByteArrayOutputStream


----------



## andi24 (5. Mrz 2008)

@Beni

Steht doch in Zeile 6 (?)

@SlaterB

Und was mach ich mit dem ByteArrayOutputStream ?
Wie komme ich damit zu einem BufferedInputStream (das ist ja die eigentliche Frage) ?

Gruß
Andi


----------



## SlaterB (5. Mrz 2008)

bisher hast du

FileOutputStream fileOut = new FileOutputStream(f); 
excelObj.write(fileOut); 
fileOut.close(); 

nun machst du darauf

ByteArrayOutputStream b= new ByteArrayOutputStream(); 
excelObj.write(b); 
b.close(); 

so in etwa, vielleicht brauchts kein close() und noch ähnliche Änderungen,
schaue bei google nach Beispielen für ByteArrayOutputStream  falls dir noch unbekannt

> Wie komme ich damit zu einem BufferedInputStream 

brauchst du nicht, ByteArrayOutputStream liefert ein byte[], siehe API,
BufferedInputStream akzeptiert aber vielleicht auch ByteArrayOutputStream , siehe API

ok, komplette Antworten wären vielleicht schöner, hier gibts erstmal nur Hinweise


----------



## Beni (5. Mrz 2008)

andi24 hat gesagt.:
			
		

> Steht doch in Zeile 6 (?)


Nein

.
.
.

Da übergibst du der Methode "write" einen OutputStream, aber "write" gibt garnichts zurück.


```
ByteArrayOutputStream out = new ByteArrayOutputStream();
excelObj.write( out );
out.close();

byte[] array = out.toByteArray();
```

Siehe auch hier

[Edit: uh, hab SlaterBs Antwort nicht gesehen, dann gibt es hier halt noch ein bisschen mehr Lösung :wink: ]


----------



## andi24 (5. Mrz 2008)

Danke euch Beiden !

@Beni



> .toByteArray()



Das war die Lösung ! 
Ich werde mich bemühen meine Fragen genauer zu formulieren (wegen Rückgabewert), aber ich dachte man sieht es anhand von dem Beispielcode was ich meine ;-)


Ansonsten ist das mit Java so eine Sache, da programmiere ich MQSeries- und SAP-Anbindungen (in diesem Fall rufe ich einen Webservice zu einem Dokumenten Managment System auf), aber ich bekomme keine ByteArray hin  In anderen Programmiersprachen gibt es nur Datentypen wie String, File und Character (usw.), den Rest programmiert man selber   

Gruß
Andi


----------

