1. 程式人生 > >哈夫曼樹演算法壓縮檔案

哈夫曼樹演算法壓縮檔案

今天上午上了哈夫曼演算法壓縮的課,我學習到了用哈夫曼演算法壓縮檔案,可以將一個檔案壓縮百分之六十左右的大小。

具體原理是:檔案是由一個個位元組組成,而位元組有自己的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;
	}

下面是程式操作的結果(圖):






這就是今天所學到的哈夫曼壓縮,明天就學習哈夫曼解壓了,加油!奮鬥奮鬥奮鬥