您的位置:首页 > 编程语言 > Java开发

文件压缩与解压

2015-09-07 16:12 411 查看
文件的压缩:

1.读取文件的内容

2.统计每个字符出现的次数

int read;

while ((read = bis.read()) != -1)//直至读到文件结束
{
// 第一个读到a,read为97
allChar[read]++;//当read为97时allChar自加
//System.out.println(allCode[read]);
}
// Arrays为操作数组的工具类(Collections为操作集合工具类)
//System.out.println(Arrays.toString(allChar));
bis.close();

3.构建哈弗曼树,生成哈夫曼编码

if(node.getLeftNode()==null&&node.getRightNode()==null){
//如果是叶子节点
int data=node.getData();
allCode[data]=dict;//dict为字符串初始值为0
}
if(node.getLeftNode()!=null){
createHfmDict(node.getLeftNode(),dict+"0");
}
if(node.getRightNode()!=null){
createHfmDict(node.getRightNode(),dict+"1");
}

4.向文件中写入每个哈夫曼编码的长度

for(int i=0;i<allCode.length;i++){
int l=allCode[i].length();//哈夫曼编码的长度
bos.write(l);
//System.out.print("...."+l);
}

5.将哈夫曼编码生成二进制代码加入压缩文件中{fileData为StringBuffer型,长度可变,可以增加数据和删除数据}

String strb = "";//哈夫曼编码的初始值
for (int i = 0; i < allCode.length; i++) {
strb = strb+allCode[i];
}
fileData.append(strb);//往压缩文件中加入哈夫曼编码的二进制
6.读取文件里的内容,将其转化为二进制代码加入压缩文件中

int read;
StringBuffer sb =new StringBuffer();
while((read=bis.read())!=-1){//读取文件中的内容
String hfmCode=allCode[read];
sb.append(hfmCode);
//fileData.append(sb);
}
fileData.append(sb);


7.如果压缩文件中二进制位数不是8的倍数,在其后面补零,直至够8的倍数,在在其后面加入8位补零的个数。

int count=0;
while(fileData.length()%8!=0){
fileData.append("0");
count++;
}
//将count转化为二进制
String countBin=Integer.toBinaryString(count);
//对countBin进行补零操作
while(countBin.length()<8){
countBin="0"+countBin;
}
fileData.append(countBin);

8.将压缩文件中的二进制代码写入压缩文件中

while(fileData.length()!=0){
//截取前八个
String subString=fileData.substring(0, 8);
//转化为10进制
int parseInt=Integer.parseInt(subString, 2);
bos.write(parseInt);
fileData.delete(0, 8);
}

文件的解压:

1读取压缩文件中的二进制串

int read;
int i = 0,j=0;
int[] a=new int[(int) (file.length()-256)];
while((read=bis.read())!=-1){
i++;
if(i<257){
continue;
}
else{
a[j]=read;
j++;
}
}

2从文件的最后读取文件,获得补零的位数,移除补的零

for( i=0;i<a.length;i++){
String data=Integer.toBinaryString(a[i]);
//对转化的数进行补零,使其成为8位

while((data.length()%8)!=0){
data="0"+data;
}
//加入str
str.append(data);


3.截取哈夫曼编码,根据图中存储的一一对应关系翻译压缩文件,生成解压文件

for(int i=0;i<allCode.length;i++){
if(allCode[i]==0){
continue;
}
else{
String subString=str.substring(0,allCode[i]);
str.delete(0, allCode[i]);
keyCode.put(subString, i);//比较字典
}
}

4.将解压后的文件写入解压文件中

//进行翻译
int i=1;
while(str.length()!=0){//根据字典生成解压文件
String key=str.substring(0, i);
if(keyCode.containsKey(key)){
bos.write(keyCode.get(key));//向文件中写入内容
str.delete(0, i);
i=1;
}
else{
i++;
}
}
bos.flush();
bos.close();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 压缩