I am trying to write a class that can compress data. The below code fails (no exception is thrown, but the target .gz file is empty.)
Besides: I don't want to generate the .gz file directly like it is done in all examples. I only want to get the compressed data, so that I can e.g. encrypt it before writting the data to a file.
If I write directly to a file everything works fine:
import java.io.*; import java.util.zip.*; import java.nio.charset.*; public class Zipper { public static void main(String[] args) { byte[] dataToCompress = "This is the test data." .getBytes(StandardCharsets.ISO_8859_1); GZIPOutputStream zipStream = null; FileOutputStream fileStream = null; try { fileStream = new FileOutputStream("C:/Users/UserName/Desktop/zip_file.gz"); zipStream = new GZIPOutputStream(fileStream); zipStream.write(dataToCompress); fileStream.write(compressedData); } catch(Exception e) { e.printStackTrace(); } finally { try{ zipStream.close(); } catch(Exception e){ } try{ fileStream.close(); } catch(Exception e){ } } } } But, if I want to 'bypass' it to the byte array stream it does not produce a single byte - compressedData is always empty.
import java.io.*; import java.util.zip.*; import java.nio.charset.*; public class Zipper { public static void main(String[] args) { byte[] dataToCompress = "This is the test data." .getBytes(StandardCharsets.ISO_8859_1); byte[] compressedData = null; GZIPOutputStream zipStream = null; ByteArrayOutputStream byteStream = null; FileOutputStream fileStream = null; try { byteStream = new ByteArrayOutputStream(dataToCompress.length); zipStream = new GZIPOutputStream(byteStream); zipStream.write(dataToCompress); compressedData = byteStream.toByteArray(); fileStream = new FileOutputStream("C:/Users/UserName/Desktop/zip_file.gz"); fileStream.write(compressedData); } catch(Exception e) { e.printStackTrace(); } finally { try{ zipStream.close(); } catch(Exception e){ } try{ byteStream.close(); } catch(Exception e){ } try{ fileStream.close(); } catch(Exception e){ } } } }
DeflaterOutputStreamorGZipOutputStream