我目前正在开发一个Java / Android应用程序,允许用户压缩和解压缩文件。起初,我开始研究文件大小,例如:
1Byte = 8Bits
1KB = 1024Byte
1MB = 1024KB
1GB = 1024MB
1TB = 1024GB
1PB = 1024TB
1EB = 1024PB
1ZB = 1024EB
1YB = 1024ZB
在我学习了这篇文章后,我研究并阅读了网上的一些文章,发现有两种类型的文件压缩(如果我错了就纠正我):无损和有损。无损压缩意味着文件被压缩成较小的位而不会丢失任何单个文件,而有损压缩意味着在压缩文件时删除了重要文件。
我还读到压缩(游程编码方法)是这样的:
AAABBCCDFFFFEEEEH
到此:
3A2B2CD4F4EH
让我了解压缩/解压缩如何在文件上工作。
我还在网上搜索了在java上压缩文件的API(也适用于android)
java.util.zip
我还尝试了从各种有用的网站/论坛/等(包括stackoverflow.com)压缩和解压缩文件的一些代码,这给了我这次研究的经验。
我还读到了数据压缩中使用的算法
Huffman encoding algorithm - assigns a code to characters in a file based on how frequently those characters occur
run-length encoding - generates a two-part value for repeated characters: the first part specifies the number of times the character is repeated, and the second part identifies the character
Lempel-Ziv algorithm - converts variable-length strings into fixed-length codes that consume less space than the original strings.
现在,我需要知道如何使用java.util.zip编写一个算法来压缩和解压缩文件(我也不知道如何使用它.net上的教程对我不起作用:/)。什么algo做winzip,winrar,压缩文件夹(windows)和androzip(android app)正在使用?有人请一步一步地教我(对待我是一个未受过教育的人)关于java.util.zip如何工作以及不同的算法。对不起,很长一点的朋友。感谢您将来的帮助和帖子(如果有的话)!
答案 0 :(得分:0)
public static final byte[] unzip(byte[] in) throws IOException {
// decompress using GZIPInputStream
ByteArrayOutputStream outStream =
new ByteArrayOutputStream(EXPECTED_COMPRESSION_RATIO * in.length);
GZIPInputStream inStream =
new GZIPInputStream ( new ByteArrayInputStream(in) );
byte[] buf = new byte[BUF_SIZE];
while (true) {
int size = inStream.read(buf);
if (size <= 0)
break;
outStream.write(buf, 0, size);
}
outStream.close();
return outStream.toByteArray();
}
public static final byte[] zip(byte[] in) {
try {
// compress using GZIPOutputStream
ByteArrayOutputStream byteOut=
new ByteArrayOutputStream(in.length / EXPECTED_COMPRESSION_RATIO);
GZIPOutputStream outStream= new GZIPOutputStream(byteOut);
try {
outStream.write(in);
} catch (Exception e) {
LOG.error("", e);
}
try {
outStream.close();
} catch (IOException e) {
LOG.error("", e);
}
return byteOut.toByteArray();
} catch (IOException e) {
LOG.error("", e);
return null;
}
}