A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 15044393192 中级黑马   /  2016-4-7 19:20  /  1138 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

package com.qdmmy6;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

import qdmmy6.file.*;
import qdmmy6.file.listener.*;
import java.io.*;

/**
* 小心使用,使用不当文件无法还原!切记!切记!!!
* @author
*
*/
public class JiaMiFrame extends JFrame {
        public static void main(String[] args) {
                JiaMiFrame frame = new JiaMiFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setVisible(true);
        }
       
        private JPasswordField pwdField = new JPasswordField(10);//密钥,用于加密与解密
        private JButton btn = new JButton("Submit");                        //提交加密或解密操作
       
        private FileOptions fo;                //用于扫描文件夹
       
        private String password = "qdmmy6";        //默认密钥
       
        private JCheckBox box = new JCheckBox("加密");                //操作,如果选中,表示加密操作,否则解密操作
       
        private JTextField pathField = new JTextField(10);        //显示要加密或解密的文件夹
        private JFileChooser jfc = new JFileChooser();                //胜于选择被加密或解密的文件夹
        private JButton button = new JButton("Path");                //点击它会弹出JFileChooser
       
        private JLabel label = new JLabel(new ImageIcon("1.gif"));//等待图片
       
        public JiaMiFrame() {
                this.init();
                this.addCommponent();
                this.addListener();
        }
       
        private void init() {
                this.setSize(262, 200);
                this.setLocation(300, 200);
                this.setResizable(false);
        }
       
        private void addCommponent() {
                // 只能选择文件夹
                jfc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
                // 文本框不能使用
                pathField.setEditable(false);
               
                //该面板添加显示加密或解密路径的文本框,以及弹出JFileChooser的按钮
                JPanel pathPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
                pathPanel.add(pathField);
                pathPanel.add(button);
               
                //该面板添加密码框,以及提交加密或解密的按钮,还有选择操作项的JCheckBox(选中,表示加密操作,否则解密操作)
                JPanel panel = new JPanel(new FlowLayout(FlowLayout.LEFT));
                panel.add(pwdField);
                panel.add(btn);
                panel.add(box);
               
                this.add(pathPanel, BorderLayout.NORTH);
                this.add(panel, BorderLayout.SOUTH);
               
                //等待图片在JLabel中居中
                this.label.setHorizontalAlignment(JLabel.CENTER);
                //默认不显示等待图片,只有在提交了加密或解密操作之后才显示,到操作完成后,再次隐藏等待图片
                label.setVisible(false);
                this.add(label);
        }
       
        private void addListener() {
                btn.addActionListener(new ActionListener() {
                        public void actionPerformed(ActionEvent evt) {
                                //获取密码,如果用户没有输入密码,使用默认密码
                                String pwd = new String(pwdField.getPassword());
                                password = pwd.length() > 0 ? pwd : password;
                                //使用路径实例化fo,并给fo添加操作监听器,然后清空密码框中的文本
                                fo = new FileOptions(pathField.getText());
                                fo.addFileSearchListener(new EncryptListener());
                                pwdField.setText("");
                                // 使用一个线程来完成扫描文件夹操作
                                new Thread() {
                                        public void run() {
                                                fo.search();
                                        }
                                }.start();
                                //使提交加密或解密操作的按钮不可用。
                                btn.setEnabled(false);
                                //使等待图片显示出来
                                label.setVisible(true);
                        }
                });
               
                button.addActionListener(new ActionListener() {
                        public void actionPerformed(ActionEvent evt) {
                                //弹出JFileChooser,获取用户选择的路径,并显示在文本框内
                                int m = jfc.showOpenDialog(JiaMiFrame.this);
                                if(m == JFileChooser.APPROVE_OPTION) {
                                        pathField.setText(jfc.getSelectedFile().getAbsolutePath());
                                }
                        }
                });
        }
       
        //加密解密算法,当flag为true时为加密,否则为解密
        //将from复制到to。
        //从from中获取的字节数组,先处理后,再写到to中。
        //删除from文件
        private static void encrypt(File from, File to, String k, boolean flag) {
                try {  
                        BufferedInputStream in = new BufferedInputStream(new FileInputStream(from));
                        BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(to));
                        byte[] b = new byte[1024];
                        int i;
                        while((i = in.read(b)) != -1) {
                                encrypt(b, k, flag);
                                out.write(b, 0, i);
                        }
                        in.close();
                        out.close();
                        from.delete();
                } catch(IOException exception) {
                        exception.printStackTrace();
                }
        }
       
        //处理b
        //flag为true时,每个字节减去相应的密钥,否则加。
        //密码来自于key字符串中的字符。
        //b[0]与b[key.getLength()]所使用的密钥都是key.getCharAt(0)
        private static void encrypt(byte[] b, String key, boolean flag) {
                int len = key.length();
                int index = 0;
                for(int i = 0; i < b.length; i++) {
                        if(flag) {
                                b[i] -= (byte)key.charAt(index++ % len);
                        } else {
                                b[i] += (byte)key.charAt(index++ % len);
                        }
                }
        }
       
        //在FileOptions开始扫描文件夹时,会调用监听器的相应方法
        private class EncryptListener extends AbstractListener {
               
                //当扫描到一个文件时,该方法会被调用
                public void disposeFile(File file) {
                        //if中完成的是加密,else中完成的是解密
                        if(box.isSelected()) {
                                //创建to文件,给原文件添加扩展名".Q6"
                                File to = new File(file.getAbsolutePath() + ".Q6");
                                encrypt(file, to, password, true);
                        } else {
                                //把所有加密后的文件解密
                                String path = file.getAbsolutePath();
                                //加密后的文件扩展名都为Q6,解密需要创建一个新文件,新文件的扩展名需要去除.Q6
                                if(path.endsWith("Q6")) {
                                        File to = new File(path.substring(0, path.lastIndexOf(".")));
                                        encrypt(file, to, password, false);
                                }
                        }
                       
                }       
                //扫描完成后会调用此方法
                public void searchEnd() {
                        box.setSelected(false);
                        box.setEnabled(false);
                        label.setVisible(false);
                        btn.setEnabled(true);
                        JOptionPane.showMessageDialog(JiaMiFrame.this, "成功!");
                }
        }
}

1 个回复

倒序浏览
赞赞赞,大神的节奏。牛人牛人。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马