Проблема с Zipped Streams из .Net и чтение их с Java - PullRequest
1 голос
/ 09 ноября 2009

Я пытаюсь заархивировать поток из .Net, который можно прочитать из кода Java. Поэтому в качестве входных данных у меня есть байтовый массив, который я хочу сжать, и я ожидаю иметь двоичный массив.

Я тестировал SharpZipLib и DotNetZip для сжатого байтового массива, но, к сожалению, я всегда получаю сообщение об ошибке при попытке распаковать его с помощью класса java.util.zip.Deflater в Java.

Есть ли у кого-нибудь пример кода сжатия String или байтового массива с помощью .Net и распаковки его с помощью класса java.util.zip.Deflater?

Ответы [ 3 ]

2 голосов
/ 09 ноября 2009

Вам не нужно трогать Deflater. Deflater имеет дело с распаковкой отдельных записей в zip-файле.

ZipInputStream - нечетный класс. Существует также ZipFile, если вам действительно нужно использовать произвольный доступ к реальному файлу (по многим причинам я бы не рекомендовал его).

1 голос
/ 10 ноября 2009

Inflater не читает потоки zip. Он читает потоки ZLIB (или DEFLATE). Формат ZIP окружает чистый поток DEFLATE дополнительными метаданными. Inflater не обрабатывает эти метаданные.


Если вы накачиваете на стороне Java, вам нужен Inflater.
На стороне .NET вы можете использовать класс Ionic.Zlib.ZlibStream из DotNetZip для сжатия - другими словами, для создания чего-то, что может читать Java Inflater.

Я только что проверил это; этот код работает. Сторона Java распаковывает то, что сжато стороной .NET.

.NET сторона:

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

сторона Java:

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");
}

(Я немного заржавел на Java, так что это может вынести некоторое улучшение, но вы поняли)

0 голосов
/ 09 ноября 2009

Вот страница от Sun на ZipStreams: http://java.sun.com/developer/technicalArticles/Programming/compression/

Другая библиотека, которая имеет дело с ZipStreams, - это POI. Он больше ориентирован на работу с документами формата MS OFfic XML, но может иметь несколько иное представление о том, как обрабатывать поток. http://poi.apache.org/apidocs/org/apache/poi/openxml4j/opc/internal/marshallers/ZipPartMarshaller.html

...