哈夫曼樹演算法壓縮檔案
阿新 • • 發佈:2019-01-05
今天上午上了哈夫曼演算法壓縮的課,我學習到了用哈夫曼演算法壓縮檔案,可以將一個檔案壓縮百分之六十左右的大小。
具體原理是:檔案是由一個個位元組組成,而位元組有自己的ASCII碼值,然後用一個整形陣列把檔案的ASCII碼值記下來,出現了一個就在其對應的ASCII值得int陣列下標加一。然後用哈夫曼演算法處理這個整形陣列,得到哈夫曼編碼值,然後讀入檔案的哈夫曼編碼值,最後寫入壓縮檔案。
哈夫曼壓縮需要三個容器,一個是存資料位元組,一個是哈夫曼節點,一個是存哈夫曼編碼
程式碼如下:
private int[] data = new int[256]; private LinkedList<HuffmNode> list = new LinkedList<HuffmNode>(); private String[] codestr = new String[256]; //程式碼塊:讓哈夫曼編碼置為空字串 { for(int i=0;i<codestr.length;i++){ codestr[i] = ""; } }
壓縮檔案分五個步驟執行:
public static void main(String[] args) { Compress com = new Compress(); //1.讀取原始檔,統計每個位元組出現次數 com.datatime(); //2.構建哈夫曼節點 com.creatNode(); //3.構建哈夫曼樹 com.creatHuffmTree(); //4.得到哈夫曼編碼 com.getCode(com.list.get(0),""); //5.再次讀入檔案的哈夫曼編碼,並寫入壓縮檔案(儲存資料順序,用於解壓); com.writeFile(); }
具體方法程式碼如下:
public void datatime(){ try { //檔案輸入流讀取test.txt檔案 FileInputStream fis = new FileInputStream("C:\\Users\\asus\\Desktop\\test.txt"); int value = fis.read(); while(value!=-1){ data[value] ++; value = fis.read(); } } catch (Exception e) { e.printStackTrace(); } }
建立節點、哈夫曼樹和構造哈夫曼編碼和上一個部落格一樣,略。
<span style="font-size:24px;">//壓縮檔案的實現
public void writeFile(){
//1.讀檔案,得到編碼串
try {
FileOutputStream fos = new FileOutputStream("C:\\Users\\asus\\Desktop\\test.zip");
FileInputStream fis = new FileInputStream("C:\\Users\\asus\\Desktop\\test.txt");
int value = fis.read();
String str = "";
while(value!=-1){
String c = codestr[value];
str = str + c ;
value = fis.read();
}
//2.壓縮結果寫入壓縮檔案
while(str.length()>=8){
String s = str.substring(0,8);
int v = StringToInt(s);
fos.write(v);
fos.flush();
str = str.substring(8); //擷取從第八位位元組後面的位元組數
}
//3.把最後一點位元組寫出去
int zero = 8 - str.length();
for(int i=0;i<zero;i++){
str = str + "0";
}
int v = StringToInt(str);
fos.write(v);
fos.flush();
//4.把補零個數寫入檔案
fos.write(zero);
fos.flush();
fis.close();
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}</span>
這裡涉及到了八位字串轉成int型的方法:
public int StringToInt(String s){
int c1 = (int)s.charAt(0)-48;
int c2 = (int)s.charAt(1)-48;
int c3 = (int)s.charAt(2)-48;
int c4 = (int)s.charAt(3)-48;
int c5 = (int)s.charAt(4)-48;
int c6 = (int)s.charAt(5)-48;
int c7 = (int)s.charAt(6)-48;
int c8 = (int)s.charAt(7)-48;
int result = c8*1+c7*2+c6*4+c5*8+c4*16+c3*32+c2*64+c1*128;
return result;
}
下面是程式操作的結果(圖):
這就是今天所學到的哈夫曼壓縮,明天就學習哈夫曼解壓了,加油!