String komprimieren, GZip funktioniert, Zip nicht?

DarthShader

Erfahrenes Mitglied
Hallo zusammen,

ich möchte gerne den Inhalt eines Strings (XML Daten) mit einem ZipOutputStream komprimieren. Leider schaffe ich es bisher nur mit GZIPOutputStream, was folgendes Programm demonstriert:

Java:
public class CompressedStringTest {
	private static final String	FILENAME	= "test.xml";
	
	public CompressedStringTest() throws IOException {
		File file = new File( FILENAME );
		String xml = FileUtil.readFile( file );
		
		System.out.println( "xml.getBytes().length: "+ xml.getBytes().length );
		
		ByteArrayOutputStream out = new ByteArrayOutputStream();
		GZIPOutputStream zipout = new GZIPOutputStream( out );
		
		zipout.write( xml.getBytes() );
		
		System.out.println( "out.toByteArray().length: " + out.toByteArray().length);
	}
	
	public static void main( String[] args ) throws IOException {
		new CompressedStringTest();
	}
}

Das funktioniert, die Ausgabe lautet:

Java:
xml.getBytes().length: 579950
out.toByteArray().length: 52974

Verwende ich jedoch statt GZIPOutputStream die Klasse ZipOutputStream, so erhalte ich folgende Exception:

Java:
Exception in thread "main" java.util.zip.ZipException: no current ZIP entry
	at java.util.zip.ZipOutputStream.write(Unknown Source)
	at java.io.FilterOutputStream.write(Unknown Source)
	at de.test.zip.CompressedStringTest.<init>(CompressedStringTest.java:24)
	at de.test.zip.CompressedStringTest.main(CompressedStringTest.java:31)

Kann mir jemand erklären, warum GZIPOutputStream geht, aber ZipOutputStream nicht?


Vielen Dank für Eure Hilfe!
 
Die Frage hat sich erledigt, natürlich arbeitet Zip auf "Einheiten", also Dateien bzw. Zip-Einträgen, GZip dagegen kennt nur den Stream der Daten (warum es unter Linux ja auch mit "tar" zusammen verwendet wird).
 
Es stellt sich dann aber die berechtigte Frage, warum es einen ZipOutputStream überhaupt gibt, wenn man ihn nicht API-konform benutzen kann. In der API-Dokumentation steht dazu auch nix -- sofern ich keine Tomaten auf den Augen habe ;-) Da hätte ich schon einen dicken Hinweis erwartet, oder dass die Klasse dann einen default ZipEntry erzeugt oder was auch immer.
 
Zurück