views:

81

answers:

3

I'm trying to zip a stream from .Net that can be read from Java code. So as input I have a byte array, which I want to compress and I'm expecting to have a binary array.

I've tested with SharpZipLib and DotNetZip to the compressed byte array, but unfortunately I always get an error when trying to uncompress it using the java.util.zip.Deflater class in Java.

Do someone have a code sample of compressing a String or a byte array with .Net and de-compressing it with the java.util.zip.Deflater class?

A: 

Here is the page from Sun on ZipStreams: http://java.sun.com/developer/technicalArticles/Programming/compression/

Another library that deals with ZipStreams is POI. It is more focused on working with MS OFfic XML format docs but it might have some different insights as to how to handle the stream. http://poi.apache.org/apidocs/org/apache/poi/openxml4j/opc/internal/marshallers/ZipPartMarshaller.html

Kelly French
+2  A: 

You shouldn't need to touch Deflater. Deflater deals with decompressing individual entries within the zip file.

ZipInputStream is the odd class to go for. There is also ZipFile if you really need to go for random access to an actual file (for many reasons, I wouldn't recommend it).

Tom Hawtin - tackline
In fact, I only need to compress a String. I'm not dealing with a ZIP file.Stan
Stan
A: 

If you are inflating on the Java side, you need Inflater.
On the .NET side you can use, from DotNetZip, the Ionic.Zlib.ZlibStream class to compress.

I've just tested this; this code works. The Java side decompresses what the .NET side has compressed.

.NET side:

        byte[] compressed = Ionic.Zlib.ZlibStream .CompressString(originalText);
        File.WriteAllBytes("ToInflate.bin", compressed);

Java side:

public void Run()
    throws java.io.FileNotFoundException,
           java.io.IOException,
           java.util.zip.DataFormatException,
           java.io.UnsupportedEncodingException,
            java.security.NoSuchAlgorithmException
{
    String filename = "ToInflate.bin";
    File file = new File(filename);
    InputStream is = new FileInputStream(file);

    // Get the size of the file
    int length = (int)file.length();

    byte[] deflated = new byte[length];

    // Read in the bytes
    int offset = 0;
    int numRead = 0;
    while (offset < deflated.length
           && (numRead=is.read(deflated, offset, deflated.length-offset)) >= 0) {
        offset += numRead;
    }


    // Decompress the bytes
    Inflater decompressor = new Inflater();
    decompressor.setInput(deflated, 0, length);
    byte[] result = new byte[100];
    int totalRead= 0; 
    while ((numRead = decompressor.inflate(result)) > 0)
        totalRead += numRead;
    decompressor.end();

    System.out.println("Inflate: total size of inflated data: " + totalRead + "\n");

    result = new byte[totalRead];
    decompressor = new Inflater();        
    decompressor.setInput(deflated, 0, length);
    int resultLength = decompressor.inflate(result);
    decompressor.end();

    // Decode the bytes into a String
    String outputString = new String(result, 0, resultLength, "UTF-8");

    System.out.println("Inflate: inflated string: "  + outputString + "\n");
}

(I'm kinda rusty at Java so it might stand some improvement, but you get the idea)

Cheeso