# OutputStream to InputStream



## Titanpharao (1. Jun 2010)

Hallo liebe Community,

ich komme leider mal wieder nicht weiter 

und zwar habe ich einen OutputStream, den ich so auslese.

```
while ((ze = zis.getNextEntry()) != null) {
            FileOutputStream fos = new FileOutputStream(ze.getName());
            int b;
            while ((b = zis.read()) != -1) {
                fos.write(b);
            }
            fos.close();
            zis.closeEntry();
        }
```

Diesen möchte ich jetzt in einen Inputstream umleiten. Also die klasse, welche ich benötige nimmt ein File/InputStream entgegen, aber ich möchte nicht erst die Dateien entpacken, sondern sie direkt umleiten.


----------



## Ark (1. Jun 2010)

Klingt nach einer Pipe (einfach mal im Paket java.io nachgucken). Wenn das nicht weiterhilft: Code, bitte. 

Ark


----------



## Titanpharao (1. Jun 2010)

```
while ((ze = zis.getNextEntry()) != null) {
            FileOutputStream fos = new FileOutputStream(ze.getName());
            int b;
            while ((b = zis.read()) != -1) {
                fos.write(b);
            }
            fos.close();
workbook = Workbook.getWorkbook(fos); //<--- hier brauche ich einen InputStream

            zis.closeEntry();
        }
```

Ja mit so einer "pipe" habe ich da auch schon probiert, aber wuste nicht so richtig damit umzugehen, bzw ist er dann stehen geblieben :/?


----------



## L-ectron-X (1. Jun 2010)

Was meinst du mit "stehengeblieben"? Vielleicht brauchst du nur noch den Stream leeren, also flush() aufrufen, damit er den Rest schreibt. :bahnhof:


----------



## kay73 (1. Jun 2010)

Du hast ein oder mehrere Excelfiles in einer ZIP-Datei und verwendest JExcel, oder?

Ein 
	
	
	
	





```
read()
```
 auf einem 
	
	
	
	





```
PipedInputStream
```
 und ein 
	
	
	
	





```
write()
```


```
PipedOutputStream
```
 dürfen nicht zusammen gleichen Thread ausgeführt werden. Vielleicht war das das Problem mit dem "Anhalten".

Es ist aber ein bisschen Overkill, immer einen neuen Thread/ExecutorService zu erzeugen. Ein paar Tipps:

 Aus dem lokalen 
	
	
	
	





```
ExecutorService EX
```
 einen klassenweiten, 
	
	
	
	





```
final
```
 CachedThreadPool machen, damit ihn Aufrufe von 
	
	
	
	





```
workbookFromInputStream
```
 wiederverwenden können.
Nicht vergessen, das 
	
	
	
	





```
shutdown()
```
 aufrufen.


```
package jexcelpipedemo;
 
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.zip.ZipInputStream;
 
import jxl.Workbook;
 
public class JExcelPipeDemo {
    
    public Workbook workbookFromInputStream(final InputStream is) throws IOException, InterruptedException, ExecutionException {
                
        final PipedInputStream pis = new PipedInputStream();
        final PipedOutputStream pos = new PipedOutputStream(pis);
        
        final ExecutorService EX = Executors.newSingleThreadExecutor(); 
        
        final Future<Workbook> f = EX.submit(new Callable<Workbook>() {
 
            @Override
            public Workbook call() throws Exception {
                return Workbook.getWorkbook(pis);
            }
        });
        EX.shutdown();
        
        int n;
        final byte buffer [] = new byte [1024];     
        
        while(-1 != (n = is.read(buffer))) {
            pos.write(buffer, 0, n);
            pos.flush();    
        }       
        
        pos.close();
        return f.get();
    }
 
    public static void main(String[] args) throws IOException, InterruptedException, ExecutionException {
        final FileInputStream is = new FileInputStream("/home/kay/Dokumente/exceltest.zip");
        final ZipInputStream zis = new ZipInputStream(is);
        zis.getNextEntry();
        
        Workbook wb = new JExcelPipeDemo().workbookFromInputStream(zis);
        
        for(final String sheetNames : wb.getSheetNames()) {
            System.out.println(sheetNames);
        }
    }
}
```


----------



## Titanpharao (1. Jun 2010)

und jetzt sage ich dir, das die ZIP mit einem Passwort geschützt ist ... und schon geht deins nicht mehr 

Reading Password-Protected ZIP Files in Java | Martin Matula's Blog


----------



## kay73 (1. Jun 2010)

Toll, was soll das denn jetzt?


----------



## Titanpharao (1. Jun 2010)

Oder habe ich deins jetzt falsch verstanden  ?Geht das nicht irgendwie einfacher?


----------



## Titanpharao (1. Jun 2010)

Entschuldig meine Aussage zu deinem Quellcode, ich hatte damals kein Zeit und habe nur schnell drüber geschaut, es funktioniert prima auch wenn ich nicht ganz verstehe wie  aber es geht  vielen dank


----------

