我正在尝试从 .Net 压缩一个可以从 Java 代码中读取的流。所以作为输入,我有一个字节数组,我想压缩它,我希望有一个二进制数组。
我已经使用 SharpZipLib 和 DotNetZip 对压缩字节数组进行了测试,但不幸的是,在尝试使用 Java 中的 java.util.zip.Deflater 类解压缩它时,我总是遇到错误。
有人有使用 .Net 压缩字符串或字节数组并使用 java.util.zip.Deflater 类对其进行解压缩的代码示例吗?
我正在尝试从 .Net 压缩一个可以从 Java 代码中读取的流。所以作为输入,我有一个字节数组,我想压缩它,我希望有一个二进制数组。
我已经使用 SharpZipLib 和 DotNetZip 对压缩字节数组进行了测试,但不幸的是,在尝试使用 Java 中的 java.util.zip.Deflater 类解压缩它时,我总是遇到错误。
有人有使用 .Net 压缩字符串或字节数组并使用 java.util.zip.Deflater 类对其进行解压缩的代码示例吗?
你应该不需要触摸Deflater
。Deflater
处理解压缩 zip 文件中的单个条目。
ZipInputStream
是奇怪的课程。如果ZipFile
您真的需要随机访问一个实际文件(出于多种原因,我不推荐它),还有一种情况。
Inflater doesn't read zip streams. It reads ZLIB (or DEFLATE) streams. The ZIP format surrounds a pure DEFLATE stream with additional metadata. Inflater doesn't handle that metadata.
If you are inflating on the Java side, you need Inflater.
On the .NET side you can use the Ionic.Zlib.ZlibStream class from DotNetZip to compress - in other words to produce something the Java Inflater can read.
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)
这是 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