哈夫曼壓縮:
1、讀取檔案,並統計檔案中各字元出現的次數,儲存到乙個陣列中,陣列長度為256,然後每個索引都代表字元的ascii碼所代表的值,每當多乙個,就在這個索引下的值加一。**如下:
public void output()
// 關閉流
bs.close();
is.close();
} catch (filenotfoundexception e) catch (ioexception e)
}
2、對這個陣列裡的值進行排序(採用優先佇列)
①迴圈建立節點,節點裡存放ascii碼和此ascii出現的次數
②優先佇列裡存放節點
③優先佇列的排序方法通過繼承comparable介面來實現
**如下:
public void creatthree()
}
3、構建乙個哈夫曼樹,並獲取每個字元對應的碼表
①首先從優先佇列裡獲得2個最少出現的字元,並從佇列中移除這兩個
②然後構建乙個小樹,生成乙個父節點,父節點的次數為這兩個字元次數的合,並把這個父節點新增到優先佇列裡
③以此類推構建完哈夫曼樹
④每乙個父節點的左邊路徑作為0,右邊路徑作為1,然後生成每個字元所對應的碼表
**如下
// 構建哈夫曼樹
while (node_queue.size() > 1)
// 設定根節點
root = node_queue.peek();
}
/**
* 給每個葉子節點新增碼表值
* * @param node
*/public void println(hfmnode node) else
}
4、寫入檔案
①寫入頭資訊
i、寫入字元
ii、寫入該字元編碼所佔的位元組數
ⅲ、每個字元對應的碼表補了多少個0(補滿8位)
ⅳ、寫入每個字元所對應的碼表
for (int i = 0; i < node_all.length; i++)
//轉換成整型寫入檔案
int x = changestring(trans);
// 寫入轉換後的整型
bos.write(x);
// 中轉字串清空
trans = "";
// 迴圈獲得除去前八位後剩下的字元
for (int k = 8; k < writes.length(); k++)
// 把原先的字串覆蓋掉
writes = trans;
// 中轉字串清空
trans = "";
}}
②寫入檔案內容
ⅰ、把所有的字元轉化成01串,每8位乙個位元組寫入檔案
ⅱ、最後不足八位則補零,然後寫入補零個數
// 遍歷讀取檔案內容,並寫入檔案
for (int i = 0; i < length; i++)
} // 如果此時的字串位數大於等於8
if (str_matter.length() >= 8)
// 把這8位字串轉化成整形
int a = changestring(str_trans);
// 寫入轉換後的整型
bos.write(a);
// 清空轉換字串
str_trans = "";
// 迴圈獲得除去前八位後剩下的字元
for (int j = 8; j < str_matter.length(); j++)
// 把原先的字串覆蓋掉
str_matter = str_trans;
// 清空轉換字串
str_trans = "";
} }// 如果沒有滿八位,則補上0
while (str_matter.length() % 8 != 0)
// 判斷補零後的字串是否為空
if (str_matter.equals("")) // 把這8位字串轉化成整形
else
// 寫入補零計數器
string so = integer.tostring(addzero);
bos.write((int) so.charat(0));
壓縮解壓總結
壓縮 1 掃瞄需要壓縮的檔案進行讀取 注意file file file2 reader reader null try reader.close catch exception e 2 裡用哈夫曼樹對於讀取的檔案進行翻譯成01串 hafumannode root new hafumannode nu...
linux壓縮總結
linux壓縮總結 1 tar tar zcvf test.tar.gz test 壓縮 tar zxvf test.tar.gz 解壓 2 gzip,zcat 命令 gzip cdt 檔名 zcat 檔名.gz 引數 c 將壓縮的資料輸出到螢幕上,可透過資料流重導向來處理 d 解壓縮的引數 t 可...
壓縮小總結
專案背景 到目前為止最糾結的的乙個專案,在寒假補課期間就整這個專案,但一直到補課完還沒完成,一直到最近才完成的。壓縮步驟 1 將要壓縮的檔案資訊乙個乙個位元組的讀出來,並統計每個位元組出現次數 2 以檔案的每個位元組的權值來構造哈夫曼樹,並給每個位元組進行哈夫曼編碼。3 將每個位元組和其對應得哈夫曼...