OutputStream to InputStream

Titanpharao

Bekanntes Mitglied
Hallo liebe Community,

ich komme leider mal wieder nicht weiter 🙁

und zwar habe ich einen OutputStream, den ich so auslese.
Code:
        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.
 
Klingt nach einer Pipe (einfach mal im Paket java.io nachgucken). Wenn das nicht weiterhilft: Code, bitte. 😉

Ark
 
Code:
        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 :/?
 
Was meinst du mit "stehengeblieben"? Vielleicht brauchst du nur noch den Stream leeren, also flush() aufrufen, damit er den Rest schreibt. :bahnhof:
 
Du hast ein oder mehrere Excelfiles in einer ZIP-Datei und verwendest JExcel, oder?

Ein
Code:
read()
auf einem
Code:
PipedInputStream
und ein
Code:
write()
Code:
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
    Code:
    ExecutorService EX
    einen klassenweiten,
    Code:
    final
    CachedThreadPool machen, damit ihn Aufrufe von
    Code:
    workbookFromInputStream
    wiederverwenden können.
  • Nicht vergessen, das
    Code:
    shutdown()
    aufrufen.
Java:
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);
        }
    }
}
 
Zuletzt bearbeitet:
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
 

Zurück
Oben