压缩
1、扫描需要压缩的文件进行读取
注意
File file = file2;
Reader reader = null;
try {
reader = new InputStreamReader(new FileInputStream(file));
int tempchar;
while ((tempchar = reader.read()) != -1) {
// 对于windows下,\r\n这两个字符在一起时,表示一个换行。
// 但如果这两个字符分开显示时,会换两次行。
// 因此,屏蔽掉\r,或者屏蔽\n。否则,将会多出很多空行。
if (((char) tempchar) != '\r') {
allchartimes[tempchar]++;
}
}
reader.close();
} catch (Exception e) {
e.printStackTrace();
}
2、里用哈夫曼树对于读取的文件进行翻译成01串
HafumanNode root=new HafumanNode(null);
while(list.size()!=1){
//构造哈夫曼树
HafumanNode leftnode=list.poll();
HafumanNode rightnode=list.poll();
//生成当前情况下最小的父节点
int newtimes=leftnode.getTimes()+rightnode.getTimes();
HafumanNode newnode=new HafumanNode(newtimes);
newnode.setLeftnode(leftnode);
newnode.setRightnode(rightnode);
//把父节点添加到当前队列中
list.add(newnode);
root=newnode;
}
3、把01串转换成16进制,位数不足8的倍数需要补零,最后2位表示补零的个数
int k=0;
//把不足八位的个数 写入
while((mima.length()%8)!=0){
mima.append("0");
k++;
}
String sum=Integer.toBinaryString(k);
while(sum.length()<8)
sum="0"+sum;
4、把翻译的字典以及翻译过后的16进制的数据保存到一个新的文件中
while(mima.length()!=0){
String substring=mima.substring(0,8);
int parseInt = Integer.parseInt(substring, 2);
String s=Integer.toHexString(parseInt);
//System.out.println(Integer.toHexString(parseInt));
if(s.length()%2!=0)
s="0"+s;
bw.write(s);
mima.delete(0, 8);
}
压缩完成
解压
1、扫描需要解压的文件
2、按照压缩文件里面保存的字典进行翻译
3、翻译过后的结果保存到一个新的文件中
解压完成
添加界面
1、创建一个界面,添加压缩、解压两个按钮
2、对于两个按钮添加监听
JFileChooser 文件选择对话框
按下按钮响应对应的事件
if(e.getSource()==ys){
try {
yasuo(chooser.getSelectedFile());
} catch (IOException e1) {
e1.printStackTrace();
}
//System.out.print("------------------------");
}
if(e.getSource()==jy){
try {
jieya(chooser.getSelectedFile());
} catch (IOException e1) {
完整的一个压缩解压工具完成