以前为了了解哈夫曼树,而做的一个文件压缩的东东,,实现给文件压缩,与解压
话不多多说先上图,当然界面不是非常的亮,有关界面的问题,上面两篇博客已经写得很清楚了!
关键压缩技术是哈弗曼树的压缩,所谓哈弗曼树详细猛戳此网址
http://baike.baidu.com/view/127820.htm
我定义的文件格式如下
编码数 出现的字节 字节编码的长度 字节的编码 码表
代码
这个是哈弗曼节点类
一个节点有数据,权值(也就是出现的频率),左子树,右子树
- package hfyasuo;
- publicclass HfmNode {
- publicint Data;
- publicint Times;
- public HfmNode Lc;
- public HfmNode Rc;
- public HfmNode(int Data,int Times){
- this.Data=Data;
- this.Times=Times;
- }
- }
- package hfyasuo;
- public class HfmNode {
- public int Data;
- public int Times;
- public HfmNode Lc;
- public HfmNode Rc;
- public HfmNode(int Data,int Times){
- this.Data=Data;
- this.Times=Times;
- }
- }
首先你得得到你要压缩文件的里面每个字节出现的个数
- //统计文件各字节数字数
- publicint[] getByteCounts() throws IOException{
- int[] bc=newint[256];
- FileInputStream in=new FileInputStream(file);
- while(in.available()>0){
- bc[in.read()]++;
- }
- in.close();
- return bc;
- }
- //统计文件各字节数字数
- public int[] getByteCounts() throws IOException{
- int[] bc=new int[256];
- FileInputStream in=new FileInputStream(file);
- while(in.available()>0){
- bc[in.read()]++;
- }
- in.close();
- return bc;
- }
用一个数组存储起来,如果存在某个字节那么就次数+1
之后就可以根据各字节出现的数字开始构造哈夫曼树
- publicint HfmCounts=0;
- //构建哈弗曼树,返回树的根节点
- public HfmNode CreatHfmNode() throws IOException{
- //构建队列,将节点加入队列
- PriorityQueue<HfmNode> hfmshu=new PriorityQueue<HfmNode>(1,new Mycomparator());
- int[] bc=getByteCounts();
- for(int i=0;i<256;i++){
- if(bc[i]!=0){
- HfmNode h=new HfmNode(i,bc[i]);
- hfmshu.add(h);
- HfmCounts++;
- }
- }
- //System.out.println("产生了"+HfmCounts+"个节点");
- //构建哈弗曼树
- while(hfmshu.size()>1){
- HfmNode h1=hfmshu.poll();
- HfmNode h2=hfmshu.poll();
- HfmNode hh=new HfmNode(h1.Data+h2.Data,h1.Times+h2.Times);
- hh.Lc=h1;
- hh.Rc=h2;
- hfmshu.add(hh);
- }
- //获取根节点
- HfmNode Root=hfmshu.peek();
- return Root;
- }
- public int HfmCounts=0;
- //构建哈弗曼树,返回树的根节点
- public HfmNode CreatHfmNode() throws IOException{
- //构建队列,将节点加入队列
- PriorityQueue<HfmNode> hfmshu=new PriorityQueue<HfmNode>(1,new Mycomparator());
- int[] bc=getByteCounts();
- for(int i=0;i<256;i++){
- if(bc[i]!=0){
- HfmNode h=new HfmNode(i,bc[i]);
- hfmshu.add(h);
- HfmCounts++;
- }
- }
- //System.out.println("产生了"+HfmCounts+"个节点");
- //构建哈弗曼树
- while(hfmshu.size()>1){
- HfmNode h1=hfmshu.poll();
- HfmNode h2=hfmshu.poll();
- HfmNode hh=new HfmNode(h1.Data+h2.Data,h1.Times+h2.Times);
- hh.Lc=h1;
- hh.Rc=h2;
- hfmshu.add(hh);
- }
- //获取根节点
- HfmNode Root=hfmshu.peek();
- return Root;
- }
利用优先队列PriorityQueue<HfmNode> hfmshu=new PriorityQueue<HfmNode>(1,new Mycomparator());
存储节点,然后在根据哈夫曼数的特点来构造哈夫曼树
其中优先队列重写他的比较方法,这里应该是比较节点的次数
- package hfyasuo;
- import java.util.Comparator;
- publicclass Mycomparator implements Comparator<HfmNode>{
- @Override
- publicint compare(HfmNode n1, HfmNode n2) {
- // TODO Auto-generated method stub
- if(n1.Times<n2.Times){
- return -1;
- }elseif(n1.Times>n2.Times){
- return1;
- }else{
- return0;}
- }
- }
- package hfyasuo;
- import java.util.Comparator;
- public class Mycomparator implements Comparator<HfmNode>{
- @Override
- public int compare(HfmNode n1, HfmNode n2) {
- // TODO Auto-generated method stub
- if(n1.Times<n2.Times){
- return -1;
- }else if(n1.Times>n2.Times){
- return 1;
- }else{
- return 0;}
- }
- }
树构建好后,现在开始获取编码
- //构造,获取各字节的编码
- publicvoid getCode(HfmNode Root,String s){
- if(Root.Lc!=null){
- getCode(Root.Lc,s+'0');
- }
- if(Root.Rc!=null){
- getCode(Root.Rc,s+'1');
- }
- if(Root.Lc==null&&Root.Rc==null){
- Code[Root.Data]=s;
- //System.out.println("得到了一个编码"+Root.data+' '+s);
- }
- }
- //构造,获取各字节的编码
- public void getCode(HfmNode Root,String s){
- if(Root.Lc!=null){
- getCode(Root.Lc,s+'0');
- }
- if(Root.Rc!=null){
- getCode(Root.Rc,s+'1');
- }
- if(Root.Lc==null&&Root.Rc==null){
- Code[Root.Data]=s;
- //System.out.println("得到了一个编码"+Root.data+' '+s);
- }
- }
接下来,就是要按照自己的定义的格式将编码写入到文件当中,写入的信息必须要保证能将其按照规则解压
那么要实现到压缩,就必得动些手脚,,写入最少是一个字节一个字节的写入(一个字节是八位),就是byte为最小单位,现在我们是要写入编码,比如说得到的三个编码是010 110 01100一般写入是要是三个字节,就是写入00000010
00000110 0001100这三个字节,但是如果我们将这三个字节作为一个字节存入,就是写入01011001100,这岂不是就达到了压缩嘛,也就是将不足八位的编码凑成八位写入
- //写入文件的总数,写入节点数,写入出现的字节,每个字节的编码长度,写入码表,写入文件的编码
- publicvoid writeBytesCodes() throws IOException{
- FileInputStream in=new FileInputStream(file);//获取文件的输入流
- FileOutputStream ou=new FileOutputStream(Pressedfile);
- DataOutputStream Daou=new DataOutputStream(ou);
- Daou.writeInt(in.available());//写入文件的总数
- ou.write(HfmCounts);//写入节点总数
- //System.out.println("写入的字节总数是"+HfmCounts);
- //写入出现过的字节
- int[] bc=getByteCounts();
- for(int i=0;i<256;i++){
- if(bc[i]!=0){
- ou.write(i);
- // System.out.println("写入的码表字节是"+i);
- }
- }
- //写入每个编码的长度
- for(int i=0;i<256;i++){
- if(Code[i]!=null){
- ou.write(Code[i].length());
- //System.out.println("写入的编码长度是"+Code[i].length());
- }
- }
- //写入码表
- int counts=0;
- int i=0;
- String s="";
- String writes;
- //首先对码表进行处理
- for(int l=0;l<256;l++){
- if(Code[l]==null){
- Code[l]="";
- }
- }
- //凑成八位写入
- while(counts>=8||i<256){
- if(counts<8){
- s+=Code[i];
- counts=s.length();
- i++;
- }else{
- writes=s.substring(0,8);
- ou.write(changeString(writes));
- counts=counts-8;
- s=s.substring(8);
- //System.out.println(s);
- }
- }
- if(counts>0){
- //System.out.println("此时的s"+s);
- int len=8-counts;
- for(int j=0;j<len;j++){
- s=s+"0";
- }
- ou.write(changeString(s));
- //System.out.println(len+"写入的编码是k"+s);
- }
- //写入文件的编码
- FileInputStream In=new FileInputStream(file);
- int fcounts=0;
- //int fi=0;
- String fs="";
- String fwrites;
- while(fcounts>=8||In.available()>0){
- if(fcounts<8){
- int ii=In.read();
- fs+=Code[ii];
- fcounts=fs.length();
- //System.out.println(ii+" "+Code[ii]);
- }else{
- fwrites=fs.substring(0,8);
- ou.write(changeString(fwrites));
- fcounts=fcounts-8;
- fs=fs.substring(8);
- }
- }
- if(fcounts>0){
- int len=8-fcounts;
- for(int j=0;j<len;j++){
- fs=fs+"0";
- }
- ou.write(changeString(fs));
- //System.out.println("写入的文件编码是k"+fs);
- }
- //压缩结束
- in.close();
- In.close();
- Daou.close();
- }
- //将01字符串转换为01编码
- publicint changeString(String s){
- return (((int)s.charAt(0)-48)*128+((int)s.charAt(1)-48)*64+((int)s.charAt(2)-48)*32+((int)s.charAt(3)-48)*16+((int)s.charAt(4)-48)*8+((int)s.charAt(5)-48)*4+((int)s.charAt(6)-48)*2+((int)s.charAt(7)-48));
- }
- //写入文件的总数,写入节点数,写入出现的字节,每个字节的编码长度,写入码表,写入文件的编码
- public void writeBytesCodes() throws IOException{
- FileInputStream in=new FileInputStream(file);//获取文件的输入流
- FileOutputStream ou=new FileOutputStream(Pressedfile);
- DataOutputStream Daou=new DataOutputStream(ou);
- Daou.writeInt(in.available());//写入文件的总数
- ou.write(HfmCounts);//写入节点总数
- //System.out.println("写入的字节总数是"+HfmCounts);
- //写入出现过的字节
- int[] bc=getByteCounts();
- for(int i=0;i<256;i++){
- if(bc[i]!=0){
- ou.write(i);
- // System.out.println("写入的码表字节是"+i);
- }
- }
- //写入每个编码的长度
- for(int i=0;i<256;i++){
- if(Code[i]!=null){
- ou.write(Code[i].length());
- //System.out.println("写入的编码长度是"+Code[i].length());
- }
- }
- //写入码表
- int counts=0;
- int i=0;
- String s="";
- String writes;
- //首先对码表进行处理
- for(int l=0;l<256;l++){
- if(Code[l]==null){
- Code[l]="";
- }
- }
- //凑成八位写入
- while(counts>=8||i<256){
- if(counts<8){
- s+=Code[i];
- counts=s.length();
- i++;
- }else{
- writes=s.substring(0,8);
- ou.write(changeString(writes));
- counts=counts-8;
- s=s.substring(8);
- //System.out.println(s);
- }
- }
- if(counts>0){
- //System.out.println("此时的s"+s);
- int len=8-counts;
- for(int j=0;j<len;j++){
- s=s+"0";
- }
- ou.write(changeString(s));
- //System.out.println(len+"写入的编码是k"+s);
- }
- //写入文件的编码
- FileInputStream In=new FileInputStream(file);
- int fcounts=0;
- //int fi=0;
- String fs="";
- String fwrites;
- while(fcounts>=8||In.available()>0){
- if(fcounts<8){
- int ii=In.read();
- fs+=Code[ii];
- fcounts=fs.length();
- //System.out.println(ii+" "+Code[ii]);
- }else{
- fwrites=fs.substring(0,8);
- ou.write(changeString(fwrites));
- fcounts=fcounts-8;
- fs=fs.substring(8);
- }
- }
- if(fcounts>0){
- int len=8-fcounts;
- for(int j=0;j<len;j++){
- fs=fs+"0";
- }
- ou.write(changeString(fs));
- //System.out.println("写入的文件编码是k"+fs);
- }
- //压缩结束
- in.close();
- In.close();
- Daou.close();
- }
- //将01字符串转换为01编码
- public int changeString(String s){
- return (((int)s.charAt(0)-48)*128+((int)s.charAt(1)-48)*64+((int)s.charAt(2)-48)*32+((int)s.charAt(3)-48)*16+((int)s.charAt(4)-48)*8+((int)s.charAt(5)-48)*4+((int)s.charAt(6)-48)*2+((int)s.charAt(7)-48));
- }
/********************************************下面是解压**********************************************************************/
解压就是逆过程,不多介绍,看代码
- /************************开始解压*****************************/
- public FileInputStream Fp;
- public DataInputStream Dafp;
- publicint Hfmcounts=0;
- publicvoid k(String Pressedfile) throws IOException{
- Fp=new FileInputStream(Pressedfile);
- Dafp=new DataInputStream(Fp);
- }
- //得到文件总数
- publicint getFileCounts() throws Exception{
- int Filecounts;
- Filecounts=Dafp.readInt();
- return Filecounts;
- }
- //得到节点数
- publicint getHfmcounts() throws IOException{
- Hfmcounts=Fp.read();
- return Hfmcounts;
- }
- //得到的码表中的字节
- publicbyte[] getBytes() throws IOException{
- //System.out.println("========>"+Hfmcounts);
- byte[] by=newbyte[Hfmcounts];
- Fp.read(by,0,Hfmcounts);
- return by ;
- }
- //得到字节的长度
- publicbyte[] getCodeLenths() throws IOException{
- byte[] by=newbyte[Hfmcounts];
- Fp.read(by,0,Hfmcounts);
- return by ;
- }
- //得到码表编码
- public String[] getCodes() throws IOException{
- byte[] By=getCodeLenths();
- int count=0;
- for(int i=0;i<Hfmcounts;i++){
- count+=By[i];
- }
- String[] sCode=new String[Hfmcounts];
- int c1=count/8;
- int c2=count%8;
- int c=8-c2;
- //System.out.println("------>zhengza"+c1);
- String s="";
- if(c2!=0){
- c1+=1;
- int[] Codes=newint[c1];
- //Codes[0]= Fp.read();
- for(int i=0;i<c1;i++){
- Codes[i]=Fp.read();
- s+=changeint(Codes[i]);
- //System.out.println("++++"+s);
- }
- if(c1!=0){
- s=s.substring(0,s.length()-c);
- }
- }elseif(c2==0){
- int[] Codes=newint[c1];
- for(int i=0;i<c1;i++){
- Codes[i]=Fp.read();
- s+=changeint(Codes[i]);
- //System.out.println("----"+s);
- }
- }
- int k=0;
- int y=0;
- for(int i=0;i<Hfmcounts;i++){
- y=k+By[i];
- sCode[i]=s.substring(k,y);
- //System.out.println(y+"hhh"+sCode[i]);
- k=y;
- }
- return sCode;
- }
- //得到文件编码
- public String getFileCodes() throws Exception{
- //
- String s="";
- while(Fp.available()>0){
- s+=changeint(Fp.read());
- }
- return s;
- }
- //将01编码转换成01串
- public String changeint(int k){
- char [] st=newchar[8];
- String s="";
- int i=7;
- //String sk="";
- while(k!=0){
- st[i]=(char)(k%2+48);
- k=k/2;
- i--;
- }
- for(int j=i+1;j<8;j++){
- s+=st[j];
- }
- for(int ks=7-i;ks<8;ks++){
- s="0"+s;
- }
- return s;
- }
- //解压文件
- publicvoid ReleaseFile() throws Exception{
- k(Pressedfile.getAbsolutePath());
- FileOutputStream fo=new FileOutputStream(Releasedfile);
- int count=1;
- int c=0;
- int Filecounts=getFileCounts();
- getHfmcounts();
- //System.out.println(Filecounts);
- byte[] CodeBytes=getBytes();
- //System.out.println(CodeBytes[0]+""+CodeBytes[1]+""+CodeBytes[2]);
- String[] Codes=getCodes();
- //System.out.println(Codes[0]+""+Codes[1]+""+Codes[2]);
- String FileCodes=getFileCodes();
- //System.out.println(FileCodes+" "+Filecounts);
- int i=0;
- //int k=0;
- while(i<Filecounts&&count<=FileCodes.length()){
- String s=FileCodes.substring(c,count);
- //System.out.println(s);
- for(int j=0;j<Codes.length;j++){
- if(s.equals(Codes[j])){
- fo.write(CodeBytes[j]);
- c=count;
- //System.out.println("pppp"+CodeBytes[j]);
- i++;
- }
- }
- count++;
- }
- fo.close();
- }
- }
- /************************开始解压*****************************/
- public FileInputStream Fp;
- public DataInputStream Dafp;
- public int Hfmcounts=0;
- public void k(String Pressedfile) throws IOException{
- Fp=new FileInputStream(Pressedfile);
- Dafp=new DataInputStream(Fp);
- }
- //得到文件总数
- public int getFileCounts() throws Exception{
- int Filecounts;
- Filecounts=Dafp.readInt();
- return Filecounts;
- }
- //得到节点数
- public int getHfmcounts() throws IOException{
- Hfmcounts=Fp.read();
- return Hfmcounts;
- }
- //得到的码表中的字节
- public byte[] getBytes() throws IOException{
- //System.out.println("========>"+Hfmcounts);
- byte[] by=new byte[Hfmcounts];
- Fp.read(by,0,Hfmcounts);
- return by ;
- }
- //得到字节的长度
- public byte[] getCodeLenths() throws IOException{
- byte[] by=new byte[Hfmcounts];
- Fp.read(by,0,Hfmcounts);
- return by ;
- }
- //得到码表编码
- public String[] getCodes() throws IOException{
- byte[] By=getCodeLenths();
- int count=0;
- for(int i=0;i<Hfmcounts;i++){
- count+=By[i];
- }
- String[] sCode=new String[Hfmcounts];
- int c1=count/8;
- int c2=count%8;
- int c=8-c2;
- //System.out.println("------>zhengza"+c1);
- String s="";
- if(c2!=0){
- c1+=1;
- int[] Codes=new int[c1];
- //Codes[0]= Fp.read();
- for(int i=0;i<c1;i++){
- Codes[i]=Fp.read();
- s+=changeint(Codes[i]);
- //System.out.println("++++"+s);
- }
- if(c1!=0){
- s=s.substring(0,s.length()-c);
- }
- }else if(c2==0){
- int[] Codes=new int[c1];
- for(int i=0;i<c1;i++){
- Codes[i]=Fp.read();
- s+=changeint(Codes[i]);
- //System.out.println("----"+s);
- }
- }
- int k=0;
- int y=0;
- for(int i=0;i<Hfmcounts;i++){
- y=k+By[i];
- sCode[i]=s.substring(k,y);
- //System.out.println(y+"hhh"+sCode[i]);
- k=y;
- }
- return sCode;
- }
- //得到文件编码
- public String getFileCodes() throws Exception{
- //
- String s="";
- while(Fp.available()>0){
- s+=changeint(Fp.read());
- }
- return s;
- }
- //将01编码转换成01串
- public String changeint(int k){
- char [] st=new char[8];
- String s="";
- int i=7;
- //String sk="";
- while(k!=0){
- st[i]=(char)(k%2+48);
- k=k/2;
- i--;
- }
- for(int j=i+1;j<8;j++){
- s+=st[j];
- }
- for(int ks=7-i;ks<8;ks++){
- s="0"+s;
- }
- return s;
- }
- //解压文件
- public void ReleaseFile() throws Exception{
- k(Pressedfile.getAbsolutePath());
- FileOutputStream fo=new FileOutputStream(Releasedfile);
- int count=1;
- int c=0;
- int Filecounts=getFileCounts();
- getHfmcounts();
- //System.out.println(Filecounts);
- byte[] CodeBytes=getBytes();
- //System.out.println(CodeBytes[0]+""+CodeBytes[1]+""+CodeBytes[2]);
- String[] Codes=getCodes();
- //System.out.println(Codes[0]+""+Codes[1]+""+Codes[2]);
- String FileCodes=getFileCodes();
- //System.out.println(FileCodes+" "+Filecounts);
- int i=0;
- //int k=0;
- while(i<Filecounts&&count<=FileCodes.length()){
- String s=FileCodes.substring(c,count);
- //System.out.println(s);
- for(int j=0;j<Codes.length;j++){
- if(s.equals(Codes[j])){
- fo.write(CodeBytes[j]);
- c=count;
- //System.out.println("pppp"+CodeBytes[j]);
- i++;
- }
- }
- count++;
- }
- fo.close();
- }
- }
主要方法就是这些,下面就是界面了
- publicclass Jframe extends JFrame implements ActionListener{
- public Cop c;
- public Jframe(Cop c){
- this.c=c;
- }
- publicvoid UI(){
- this.setTitle("黄飞压缩工具");
- this.setSize(400, 200);
- this.setLocationRelativeTo(null);//让窗体居中
- this.setIconImage(Toolkit.getDefaultToolkit().getImage(getClass().getClassLoader().getResource("头像.png")));
- this.setDefaultCloseOperation(3);
- //this.setAlwaysOnTop(true);
- //构建一个JPanel面板
- JPanel panel=new JPanel();
- BoxLayout layout=new BoxLayout(panel, BoxLayout.Y_AXIS);//箱式布局,按照Y轴往下排列
- panel.setLayout(layout);
- //按钮,标签
- JButton jb1=new JButton(" 压缩 ");
- jb1.setActionCommand("压缩");
- JLabel jl=new JLabel("选择你要执行的功能");
- JButton jb2=new JButton(" 解压 ");
- jb2.setActionCommand("解压");
- //居中排列
- jb1.setAlignmentX(Component.CENTER_ALIGNMENT);
- jl.setAlignmentX(Component.CENTER_ALIGNMENT);
- jb2.setAlignmentX(Component.CENTER_ALIGNMENT);
- //把组件加到面板上
- panel.add(jb1);
- panel.add(jl);
- panel.add(jb2);
- this.add(panel);
- //加入监听器
- jb1.addActionListener(this);
- jb2.addActionListener(this);
- this.setVisible(true);
- }
- /**
- * @param args
- */
- publicstaticvoid main(String[] args) {
- // TODO Auto-generated method stub
- Cop c=new Cop();
- Jframe j=new Jframe(c);
- j.UI();
- }
- @Override
- publicvoid actionPerformed(ActionEvent e) {
- // 压缩过程
- if(e.getActionCommand().equals("压缩")){
- //压缩选择,跳出文件选择器,选择要压缩的文件
- JOptionPane.showMessageDialog(null,"选择要压缩的文件");
- JFileChooser chooser = new JFileChooser();
- chooser.setFileSelectionMode(JFileChooser.OPEN_DIALOG );//打开型
- chooser.setApproveButtonText("压缩");//设置一个压缩按钮
- chooser.showDialog(null, null);//弹出选择器
- c.file=chooser.getSelectedFile();//得到要压缩的文件
- //保存过程
- JOptionPane.showMessageDialog(null,"选择要保存的路径");
- JFileChooser ch = new JFileChooser();
- ch.setFileSelectionMode(JFileChooser.SAVE_DIALOG );//保存类型
- ch.setApproveButtonText("保存");//保存按钮
- ch.showDialog(null, null);//弹出窗口
- //得到出去扩展名的文件名
- int ii=c.file.getName().lastIndexOf(".");
- String str=c.file.getName().substring(0,ii);
- //得到压缩后的文件
- File f=new File(ch.getSelectedFile(),str+".hf");
- c.Pressedfile=f;
- try {
- f.createNewFile();//创建压缩后的文件
- c.Compressfile();//压缩开始
- JOptionPane.showMessageDialog(null,"压缩完毕");
- } catch (IOException e1) {
- // TODO Auto-generated catch block
- e1.printStackTrace();
- }
- }
- //解压过程
- elseif(e.getActionCommand().equals("解压")){
- //解压过程,同上
- JOptionPane.showMessageDialog(null,"选择要解缩的文件");
- JFileChooser chooser = new JFileChooser("wenjian");
- chooser.setFileSelectionMode(JFileChooser.OPEN_DIALOG );
- chooser.setApproveButtonText("解压");
- FileNameExtensionFilter filter = new FileNameExtensionFilter("hf","hf");
- chooser.setFileFilter(filter);
- chooser.showDialog(null, null);
- c.Pressedfile=chooser.getSelectedFile();
- //保存
- JOptionPane.showMessageDialog(null, "选择解压文件的保存路径");
- JFileChooser ch = new JFileChooser("wenjian");
- ch.setFileSelectionMode(JFileChooser.SAVE_DIALOG );
- ch.setApproveButtonText("保存");
- ch.showDialog(null, null);
- int ii=c.Pressedfile.getName().lastIndexOf(".");
- String str=c.Pressedfile.getName().substring(0,ii);
- File f=new File(ch.getSelectedFile(),str+".txt");
- try {
- f.createNewFile();
- c.Releasedfile=f;
- System.out.println(f.getAbsolutePath());
- c.ReleaseFile();
- JOptionPane.showMessageDialog(null,"解压完毕");
- // c.ReleaseFile();
- } catch (IOException e1) {
- // TODO Auto-generated catch block
- e1.printStackTrace();
- } catch (Exception e1) {
- // TODO Auto-generated catch block
- e1.printStackTrace();
- }
- };
- }
- }
- public class Jframe extends JFrame implements ActionListener{
- public Cop c;
- public Jframe(Cop c){
- this.c=c;
- }
- public void UI(){
- this.setTitle("黄飞压缩工具");
- this.setSize(400, 200);
- this.setLocationRelativeTo(null);//让窗体居中
- this.setIconImage(Toolkit.getDefaultToolkit().getImage(getClass().getClassLoader().getResource("头像.png")));
- this.setDefaultCloseOperation(3);
- //this.setAlwaysOnTop(true);
- //构建一个JPanel面板
- JPanel panel=new JPanel();
- BoxLayout layout=new BoxLayout(panel, BoxLayout.Y_AXIS);//箱式布局,按照Y轴往下排列
- panel.setLayout(layout);
- //按钮,标签
- JButton jb1=new JButton(" 压缩 ");
- jb1.setActionCommand("压缩");
- JLabel jl=new JLabel("选择你要执行的功能");
- JButton jb2=new JButton(" 解压 ");
- jb2.setActionCommand("解压");
- //居中排列
- jb1.setAlignmentX(Component.CENTER_ALIGNMENT);
- jl.setAlignmentX(Component.CENTER_ALIGNMENT);
- jb2.setAlignmentX(Component.CENTER_ALIGNMENT);
- //把组件加到面板上
- panel.add(jb1);
- panel.add(jl);
- panel.add(jb2);
- this.add(panel);
- //加入监听器
- jb1.addActionListener(this);
- jb2.addActionListener(this);
- this.setVisible(true);
- }
- /**
- * @param args
- */
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- Cop c=new Cop();
- Jframe j=new Jframe(c);
- j.UI();
- }
- @Override
- public void actionPerformed(ActionEvent e) {
- // 压缩过程
- if(e.getActionCommand().equals("压缩")){
- //压缩选择,跳出文件选择器,选择要压缩的文件
- JOptionPane.showMessageDialog(null,"选择要压缩的文件");
- JFileChooser chooser = new JFileChooser();
- chooser.setFileSelectionMode(JFileChooser.OPEN_DIALOG );//打开型
- chooser.setApproveButtonText("压缩");//设置一个压缩按钮
- chooser.showDialog(null, null);//弹出选择器
- c.file=chooser.getSelectedFile();//得到要压缩的文件
- //保存过程
- JOptionPane.showMessageDialog(null,"选择要保存的路径");
- JFileChooser ch = new JFileChooser();
- ch.setFileSelectionMode(JFileChooser.SAVE_DIALOG );//保存类型
- ch.setApproveButtonText("保存");//保存按钮
- ch.showDialog(null, null);//弹出窗口
- //得到出去扩展名的文件名
- int ii=c.file.getName().lastIndexOf(".");
- String str=c.file.getName().substring(0,ii);
- //得到压缩后的文件
- File f=new File(ch.getSelectedFile(),str+".hf");
- c.Pressedfile=f;
- try {
- f.createNewFile();//创建压缩后的文件
- c.Compressfile();//压缩开始
- JOptionPane.showMessageDialog(null,"压缩完毕");
- } catch (IOException e1) {
- // TODO Auto-generated catch block
- e1.printStackTrace();
- }
- }
- //解压过程
- else if(e.getActionCommand().equals("解压")){
- //解压过程,同上
- JOptionPane.showMessageDialog(null,"选择要解缩的文件");
- JFileChooser chooser = new JFileChooser("wenjian");
- chooser.setFileSelectionMode(JFileChooser.OPEN_DIALOG );
- chooser.setApproveButtonText("解压");
- FileNameExtensionFilter filter = new FileNameExtensionFilter("hf","hf");
- chooser.setFileFilter(filter);
- chooser.showDialog(null, null);
- c.Pressedfile=chooser.getSelectedFile();
- //保存
- JOptionPane.showMessageDialog(null, "选择解压文件的保存路径");
- JFileChooser ch = new JFileChooser("wenjian");
- ch.setFileSelectionMode(JFileChooser.SAVE_DIALOG );
- ch.setApproveButtonText("保存");
- ch.showDialog(null, null);
- int ii=c.Pressedfile.getName().lastIndexOf(".");
- String str=c.Pressedfile.getName().substring(0,ii);
- File f=new File(ch.getSelectedFile(),str+".txt");
- try {
- f.createNewFile();
- c.Releasedfile=f;
- System.out.println(f.getAbsolutePath());
- c.ReleaseFile();
- JOptionPane.showMessageDialog(null,"解压完毕");
- // c.ReleaseFile();
- } catch (IOException e1) {
- // TODO Auto-generated catch block
- e1.printStackTrace();
- } catch (Exception e1) {
- // TODO Auto-generated catch block
- e1.printStackTrace();
- }
- };
- }
- }
界面主要就是一个文件选择器JFileChooser 的应用,查看API就能具体了解
相关推荐
这个库简化了在Java中处理压缩文件的过程,提供了丰富的API供开发者使用。 首先,我们来看`FileUtils.java`中的主要方法。通常,这个类会包含两个核心功能:`zipFiles()`用于创建ZIP包,`unzipFile()`用于解压ZIP包...
Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...
在压缩包子文件的文件名称列表中,仅有一个条目“drive”,这可能是指解压后的目录结构,包含了与Google Drive API相关的Java类、接口、方法和其他资源。 以下是关于Google Drive API v3和Java库的一些详细知识点:...
4. **解压文件**:Android提供了`java.util.zip`包,包含了`ZipInputStream`和`ZipEntry`类,用于处理zip文件的解压。我们可以遍历zip文件的每个条目(entry),创建对应的目标文件,然后使用`ZipInputStream`读取条...
具体到`resource`解压到本地,这可能是Hutool提供了文件操作相关的工具,例如`FileUtil`类,能够帮助开发者方便地进行文件的读写、复制、删除、解压缩等操作。对于学习者来说,这不仅是一个使用工具,也是一个学习...
Java数据压缩与传输实例 1个目标文件 摘要:Java源码,文件操作,数据压缩,文件传输 Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、...
Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...
Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...
Java数据压缩与传输实例 1个目标文件 摘要:Java源码,文件操作,数据压缩,文件传输 Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、...
【标题】:“(未经测试-仅供参考)javaweb-exam-demo.zip”可能是一个Java Web项目的示例代码压缩包,用于教学或自我学习目的。这个项目可能包含了一个完整的Web应用程序的结构,涵盖了各种Java Web开发的核心概念和...
因此,反编译结果仅供学习和参考,不应用于非法活动,如侵犯版权或窃取商业秘密。 总的来说,JAD作为一款基础的Java反编译工具,以其简单的使用方式和无需安装的特性,为开发者提供了一种查看和理解Java字节码源...
Java数据压缩与传输实例 1个目标文件 摘要:Java源码,文件操作,数据压缩,文件传输 Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、...
Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...
Java编程语言在处理文件压缩和解压缩任务时,有许多库可供选择,其中之一便是Zip4j。Zip4j是一个流行的开源库,专为Java设计,用于处理ZIP文件。它以其易用性和强大的功能而受到开发者的青睐,特别是对于需要在应用...
在压缩包子文件的文件名称列表中,仅列出“jdk-17.0.3”,这通常意味着压缩包内包含的主要内容就是JDK的安装程序或解压后的目录结构。这个目录可能含有以下几个关键部分: 1. **bin**:这个目录包含可执行文件,如`...
5.郑重声明:本软件仅供学习交流之用,但下载者不要被局限于此,还应探究更好的算法和实现。更不要抄袭以应付考试等,否则后果自负! 6.体验过程中若发现问题或不足,请与我联系,我会继续优化,谢谢!
【压缩包子文件的文件名称列表】:仅列出一个文件“JAVA魔塔.rar”,这可能是游戏项目的根目录或者包含所有源代码和资源的主文件夹。通常,一个Java项目会包含以下结构: 1. **源代码**:src目录下,按照包...
6. 配置环境变量(仅限于手动解压的情况):在Windows中,你需要编辑系统变量`Path`,添加JDK的bin目录;在Unix/Linux系统中,你需要编辑`.bashrc`或`.bash_profile`文件,添加类似`export PATH=$PATH:/path/to/jdk/...
一个jar文件本质上是一个ZIP格式的压缩文件,包含.class文件(Java字节码)、资源文件(如图片、配置文件)以及其他元数据。`.class`文件是Java源代码经过编译后的产物,无法直接阅读,因此反编译就是将这些字节码...