【Java】Swing+IO流实现一个简单的文件加密程序

EncrytService

package com.my.service;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

public class EncryptService {
    // 默认密匙路径
    private static String DEFAULT_KEY_URL = ".//KEY";
    // 临时文件路径
    private static String DEFAULT_TEMP_URL = ".//TEMP";
    // 读取密匙
    private int key[] = new int[128];
    private void readKey() {
        File keyFile = new File(DEFAULT_KEY_URL);

        try {
            FileInputStream localKey = new FileInputStream(keyFile);
            for (int i = 0; i < 128; ++i) {
                key[i] = localKey.read();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    // 生成新的密匙
    public void makeKey() {
        try {
            File keyFile = new File(DEFAULT_KEY_URL);

            FileOutputStream fos = new FileOutputStream(keyFile);

            for (int i = 0; i < 128; ++i) {
                fos.write((int)(Math.random()*128));
            }
            readKey();
            fos.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    // 加密文件
    public void encryptFile(File file) {
        try {
            FileInputStream fis = new FileInputStream(file);
            FileOutputStream fos = new FileOutputStream(new File(DEFAULT_TEMP_URL));

            int length = fis.available();
            for (int i = 0; i < length; ++i) {
                fos.write(fis.read() + key[i%128]);
            }
            fis.close();
            fos.close();
            FileInputStream fileInputStream = new FileInputStream(new File(DEFAULT_TEMP_URL));
            FileOutputStream fileOutputStream = new FileOutputStream(file);
            int length2 = fileInputStream.available();
            for (int i = 0; i < length2; ++i) {
                fileOutputStream.write(fileInputStream.read());
            }
            fileInputStream.close();
            fileOutputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    // 解密文件
    public void decryptFile(File file) {
        try {
            FileInputStream fis = new FileInputStream(file);
            FileOutputStream fos = new FileOutputStream(new File(DEFAULT_TEMP_URL));

            int length = fis.available();
            for (int i = 0; i < length; ++i) {
                fos.write(fis.read() - key[i%128]);
            }
            fis.close();
            fos.close();
            FileInputStream fileInputStream = new FileInputStream(new File(DEFAULT_TEMP_URL));
            FileOutputStream fileOutputStream = new FileOutputStream(file);
            int length2 = fileInputStream.available();
            for (int i = 0; i < length2; ++i) {
                fileOutputStream.write(fileInputStream.read());
            }
            fileInputStream.close();
            fileOutputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Main

package com.my.ui;

import com.my.service.EncryptService;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;

public class Main extends JFrame implements ActionListener {
    private EncryptService encryptService = new EncryptService();
    // 设置默认大小
    private static final int DEFAULT_WIDTH = 396;
    private static final int DEFAULT_HEIGHT = 145;
    // 组件
    private JFileChooser chooser;
    private JButton buttonEncrypt;
    private JButton buttonDecrypt;
    private JButton buttonMakeKey;
    JTextField fileText;
    JTextField keyText;
    // 文件路径
    private String filePath;
    private String keyPath;
    // 初始化加密页面
    public Main() {
        setTitle("文件加密程序");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
        setResizable(false);
        setLocationRelativeTo(null);

        JPanel panUser = new JPanel();
        // 创建组件
        fileText = new JTextField();
        fileText.setEditable(false);
        keyText = new JTextField();
        keyText.setEditable(false);
        JButton btnFile = new JButton("....");
        btnFile.setFocusPainted(false);
        JButton btnKey = new JButton("...");
        btnKey.setFocusPainted(false);
        btnKey.setEnabled(false);
        // 布局
        panUser.setLayout(new GridLayout(2, 3));
        panUser.add(new JLabel("源文件路径:"));
        panUser.add(fileText);
        panUser.add(btnFile);
        panUser.add(new JLabel("密匙路径:"));
        panUser.add(keyText);
        panUser.add(btnKey);

        buttonEncrypt = new JButton("加密");
        buttonEncrypt.setFocusPainted(false);
        buttonDecrypt = new JButton("解密");
        buttonDecrypt.setFocusPainted(false);
        buttonMakeKey = new JButton("生成新的密匙");
        buttonMakeKey.setFocusPainted(false);

        JPanel panBtn = new JPanel();
        panBtn.setLayout(new FlowLayout());
        panBtn.add(buttonEncrypt);
        panBtn.add(buttonDecrypt);
        panBtn.add(buttonMakeKey);

        setLayout(new BorderLayout());
        add(panUser, BorderLayout.CENTER);
        add(panBtn, BorderLayout.SOUTH);

        // 注册事件监听
        btnFile.addActionListener(this);
        btnKey.addActionListener(this);
        buttonMakeKey.addActionListener(this);
        buttonEncrypt.addActionListener(this);
        buttonDecrypt.addActionListener(this);

        chooser = new JFileChooser();
        chooser.setCurrentDirectory(new File("."));
    }

    public static void main(String[] args) {
        JFrame frame = new Main();
        frame.setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getActionCommand().equals("....")) {
            int result = chooser.showOpenDialog(null);
            if (result == JFileChooser.APPROVE_OPTION) {
                filePath = chooser.getSelectedFile().getPath();
                fileText.setText(filePath);
            }
        }
        if (e.getActionCommand().equals("...")) {
            int result = chooser.showOpenDialog(null);
            if (result == JFileChooser.APPROVE_OPTION) {
                keyPath = chooser.getSelectedFile().getPath();
                keyText.setText(keyPath);
            }
        }
        if (e.getActionCommand().equals("加密")) {
            encryptService.encryptFile(new File(filePath));
            System.out.println("加密成功");
        }
        if (e.getActionCommand().equals("解密")) {
            encryptService.decryptFile(new File(filePath));
            System.out.println("解密成功");
        }
        if (e.getActionCommand().equals("生成新的密匙")) {
            encryptService.makeKey();
            keyText.setText(new File("").getAbsolutePath() + "\\KEY");
            System.out.println("成功生成新的密匙");
        }
    }
}
时间: 2024-10-23 15:18:14

【Java】Swing+IO流实现一个简单的文件加密程序的相关文章

【Java】Swing+IO流实现一个简单的文件加密程序(较完整版)

留着参考 beans package com.my.bean; import java.io.Serializable; public class EncryptedFile implements Serializable { private String filePath; private String keyFullName; public EncryptedFile() { } public String getFilePath() { return filePath; } public

运用java的io流,进行简单的拷贝图片。

import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException; public class Demo01 { public static void main(String[] args) throws IOException { // TODO Auto-generated method stub Strin

使用IO流实现一个简单的小Dome

(一) 在电脑D盘下创建一个文件为HelloWorld.txt文件,判断他是文件还是目录,在创建一个目录IOTest,之后将HelloWorld.txt移动到IOTest目录下去:之后遍历IOTest这个目录下的文件 为了提高代码的安全性,这里所有的异常,我都处理了,而不是抛出,如果想方便的话,可以都抛出.import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.i

用java写一个简单的文件拷贝程序吧

代码: public static void copyFile(String srcPath, String destPath) throws IOException { //建立File对象的来源与目的 File src = new File(srcPath); File dest = new File(destPath); //由于只能拷贝文件,所以判定输入流是否为文件 if(!src.isFile()) { System.out.println("只能拷贝文件!"); throw

【Java】IO流简单分辨

转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/5827509.html Java的IO流体系十分庞大,并且体系层次稍复杂,很容易记混或记错.在此,我把平时经常用到的几个流类的简易区分以及体系层次整理出来,方便记忆与辨析.本人对IO了解尚浅,文章如有错漏,恳请前辈指正,感激不尽! 字节流体系: 基类:InputStream/outputStream(抽象类,不能new) 子类: 文件IO字节流:FileInputStream/FileoutputStream

JAVA中IO流总结

本文是在学习中的总结,欢迎转载但请注明出处:http://write.blog.csdn.net/postedit/42119261 我想你对JAVA的IO流有所了解,平时使用的也比较的多,但是对于其具体分类和继承体系可能知道的并不多,可能也很少去看相关的API文档,找出其中的关系和各自的应用情形.本文简单对常用的IO流进行分类整理,并简单举例说明其应用.希望本文对你有所帮助. (A)IO流大致分为两种: (1)字节流:对应抽象类为InputStream(输入流)和 OutputStream(输

Java之IO流详解

IO流 Input/Output 完成输入/输出 应用程序运行时——数据在内存中  ←→ 把数据写入硬盘(磁带)  内存中的数据不可持久保存的  输入:从外部存储器(硬盘.磁带.U盘)把数据读入内存. 输出:从内存中把数据写入外部存储区(硬盘.磁带.U盘)中,这样就可以保证:即使程序退出了,数据依然不会丢失. File — 代表磁盘上的文件或目录. ●  listRoots() :列出磁盘上所有的根目录 ● exists:判断是否存在 ● mkdir:创建目录 ● listFiles():列出当

利用java的Socket实现一个简单hello/hi聊天程序

利用java的Socket实现一个简单hello/hi聊天程序 首先,我们来用java实现一个简单的hello/hi聊天程序.在这个程序里,我学习到了怎么用socket套接套接字来进行编程.简单理解了一些关于socket套接字和底层调用的关系.关于java的封装思想,我学会了一些东西,java里真的是万物皆对象.还学到了一点多线程的知识. TCP 在这里,不得不先介绍以下TCP.TCP是传输层面向连接的协议.提供了端到端的进程之间的通信方式.TCP在通信之前要先建立连接.这里我们称这个建立连接的

Java基础-IO流

简单的使用IO流是很简单的~ package com.j2se.d59.demo; import java.io.*; //IO里的对象来自于java.io.*; //IO流的输入输出是相对于内存RAM的 //分类:单位[字节流.字符流]or方向[输入流.输出流]or功能[节点流.处理流] //所有的IO流由四个抽象类扩展而来: //InputStream 的子类 FileInputStream BufferedInputStream //OutputStream 的子类FileInputStr