GZIPInputStream schließen

takidoso

Erfahrenes Mitglied
Hallo und halli,
irgendwie habe ich folgendes Problem:
Ich möchte bei einer Anwendung, die etwas mit GZIPInputStream entpackt und dabei auf die Schnautze fällt die Datei mit einem Prefix umbenennen, damit sie bei einem weiteren Versuch nicht nochmal den selben Fehler verursacht.
Der Probe halber habe ich mal gnadenlos eine leere Datei dem Ganzen vorgegeben und siehe da, es fällt tatsächlich mit einem EOFileException auf die Nase, kann aber die Eingangsdatei nicht umbenennen. Mein gnadenloser Verdacht ist nun, dass es daran liegt, dass der InputStream nicht geschlossen wird.
So weit so gut, aber wie kann ich eigentlich einen GZIPInputStream schließen, wenn ich den Fehler schon im Konstruktor bekomme?
Code:
Caused by: java.io.EOFException
	at java.util.zip.GZIPInputStream.readUByte(GZIPInputStream.java:202)
	at java.util.zip.GZIPInputStream.readUShort(GZIPInputStream.java:192)
	at java.util.zip.GZIPInputStream.readHeader(GZIPInputStream.java:131)
	at java.util.zip.GZIPInputStream.<init>(GZIPInputStream.java:58)
	at de.mypackage.util.FileUtils.gunzip(FileUtils.java:594)
Irgendwie hat man da selbst doch keine Chance oder?

hier mein rudimentärer code, der natürlch eigetnlich einen try-catch-finally-Block benötigt, was aber in diesem Fall eigentlich trotzdem nichts nutzen dürfte, da ich ja AFAIK keine Refferenz auf den GZIPInputstream erhalte, weil es vorher schon verreckt.

Java:
  static public File gzip(.....)
  {
....
        File destinationFile  = new File(destFileName);
        FileOutputStream dest = new FileOutputStream(destinationFile);
        GZIPOutputStream out  = new GZIPOutputStream(dest, bufferSize);

        byte data[] = new byte[bufferSize];

        FileInputStream fis        = new FileInputStream(sourceFile);
        BufferedInputStream origin = new BufferedInputStream(fis, bufferSize);

        int count;
        while (( count = origin.read(data, 0, bufferSize) ) != -1)
        {
            out.write(data, 0, count);
        }

        origin.close();
        out.flush();
        out.close();

        return destinationFile;
    }

Gibt es da vielleicht doch einen Trick, oder muss ich in solchen Fällen die Segel streichen?

Mit noch hoffenden Grüßen

Takidoso
 
Da habe ich gestern wohl doch den Wald nicht gesehen :-)

Also die Lösung zu meinem Problem ist weniger den GZIPInputStream als vielmehr den FileInputStream zu schließen.
packe ich das ganze geschickt in ein try-finally sieht es dann so aus:
Java:
static public File gunzip (File sourceFile,
                               File goalDir,
                               int bufferSize,
                               boolean cutOutLastQualifier) throws IOException
    {
    	synchronized (syncObj)
        {
    		if (!goalDir.exists())
    		{
    			if (!goalDir.mkdirs())
    			{
    				throw new IOException("Zielverzeichnis '"+goalDir+
    				                      "' existierte nicht konnte aber auch nicht erstellt werden!");
    			}
    		}
    		else if (!goalDir.isDirectory())
    		{
    			throw new IOException("'"+goalDir+
                                      "' existiert ist aber kein Verzeichnis nicht (Zielverzeichnis)!");
    		}
        }

        String destFileName = goalDir.getAbsolutePath() + File.separator + sourceFile.getName();

        if (cutOutLastQualifier)
        {
            destFileName = destFileName.substring(0,destFileName.lastIndexOf("."));
        }

        File                 destinationFile  = new File(destFileName);
        BufferedOutputStream destStream       = new BufferedOutputStream(new FileOutputStream(destinationFile), bufferSize);
        FileInputStream      fis              = new FileInputStream(sourceFile);
        GZIPInputStream      gzInStream;
        try
        {
        	gzInStream       = new GZIPInputStream(fis,bufferSize);

        	byte data[] = new byte[bufferSize];

        	int count;
        	while (( count = gzInStream.read(data, 0, bufferSize) ) != -1)
        	{
        		destStream.write(data, 0, count);
        	}
        	gzInStream.close();
        }
        finally
        {
        	fis.close();
            destStream.flush();
            destStream.close();
        }
        

        return destinationFile;
    }

Man kann also sagen: kaum macht man es richtig, funktioniert es dann auch :-D

in diesem Sinne

Takidoso
 
Zurück