資源簡介
java實現霍夫曼(huffman)樹的壓縮和解壓縮,支持對文檔的壓縮和解壓縮
代碼片段和文件信息
import?java.io.FileInputStream;
import?java.io.FileOutputStream;
import?java.io.InputStream;
import?java.io.OutputStream;
import?java.io.OutputStreamWriter;
import?java.text.DecimalFormat;
import?java.io.*;
public?class?huffman?
{
// int?splitlable=0;//劃分邊界的個數
public?huffman()
{
???//默認符號順序是????0-9?.?#?其中#用來作為浮點數之間的間隔
int[]?count=new?int[12];?//統計個數
int[]?count2=new?int[12];//通過讀取文件來統計個數,是另一種統計方法
double[]?percent=new?double[12];//百分比
double[]?sortpercent=new?double[12];//排序后的百分比從大到小
double[]?treesortpercent=new?double[12];//排序后的百分比?,從小到大,構建霍夫曼樹需要的排序方式
int[]?sortlable=new?int[12];//sortpercent數組對應percent數組的下標
double[]?sortpercentapp=new?double[12+12-1];//構建霍夫曼樹時,需要多增加長度-1個中間節點
String[]?treecode=new?String[12+12-1];//包括在構建霍夫曼樹的過程中有中間節點的編碼
String[]?code=new?String[12];//各個數字和?.?#的編碼,已經排序
//int?[]?split=new?int[12];//分組的情況,有效的個數等于splitlable+1
byte[]?simbal=new?byte[12];//各個符號的位置,已經排序
char[]?chsimbal=new?char[12];//各個符號的位置,已經排序;
//String[]?code=new?String[12+12-1];//編碼
for(int?i=0;i<12;i++)
{
count[i]=0;
count2[i]=0;
percent[i]=0.0;
sortpercent[i]=0.0;
sortlable[i]=0;
?//???split[i]=0;
???//?code[i]=““;
}
for(int?i=0;i treecode[i]=““;
make(count);//產生隨機數,并將加密結果寫入文件
readfile(count2);//讀取加密數據的文件
getpercent(count2percentsortpercent);//獲得百分比
????sort(sortpercentsortlable);//百分比排序,從大到小
????//百分比從小到大排序
????for(int?i=0;i ???? treesortpercent[i]=sortpercent[sortpercent.length-i-1];
????
????for(int?i=0;i ???? sortpercentapp[i]=treesortpercent[i];
????maketree(sortpercentapptreecode);//構建霍夫曼樹并編碼
????//code是從大到下排序的,treecode是從小到大排序的,所以要轉換過來
?????for(int?i=0;i ???? ?code[i]=treecode[code.length-1-i];
?????sortsimbal(simbalchsimbalsortlable);//符號對應的排序
??/*
?????for(int?i=0;i ??System.out.println(“編碼“+chsimbal[i]+“:“+code[i]);??
????*/?
?????ysandwrite(countsimbalcode);//壓縮并寫入文件
?????jieyasuo();
}
//*********************************************************************************************************
//解壓縮并寫入文件
public?void?jieyasuo()//(String?code[]char?chsimbal[])
{
try
{
????String[]?code=new?String[12];//編碼的值
????char[]?chsimbal=new?char[12];//符號的類型
InputStream??isr?=?new?FileInputStream(“D:/yasuo.doc“);??
OutputStreamWriter?osw??=?new?OutputStreamWriter(new?FileOutputStream(“D:/stringyasuo2.doc“));??
OutputStreamWriter?osw2??=?new?OutputStreamWriter(new?FileOutputStream(“D:/jieya.doc“));??
String?st=““; //將int轉化為String,寫入文件中stringyasuo2
String?st2=““;//解壓縮后寫入文件中jieya.doc
String?tmpinttobin=““;//int轉化為2進制的形式最多只有32位;
int?intobinlen=0;//int轉化為2進制的形式時字符串的長度,需要考慮正整數前面自動缺0的情況
String?inttobin=““;//由上一個String剩下的和tmpinttobin的連接
????int?codelen=code.length;//符號的種類;
// char?ch;//inttobin的字符
// String?code=““;//解壓縮后的編碼
????byte[]?read=new?byte[4];?
????int?len=0;//一次讀取的
評論
共有 條評論