文件压缩与解压

文件的压缩:

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();



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值