Java可视化文件(夹)加密解密压缩解压

程序具有加密和解密两大功能。
用户选定一个文件,加密生成一个新文件,新文件文件名在原文件名后加enc,扩展名不变。如果用户选定的是一个文件夹,则递归加密文件夹下文件及子文件夹下的所有文件。
用户选定一个文件,解密生成一个新文件,新文件文件名去掉文件名后面的enc,扩展名不变。如果用户选定的是一个文件夹,则递归解密文件夹下文件及子文件夹下的所有文件。

实现文件和文件夹压缩功能,压缩后的文件能用常见解压软件进行解压。
压缩时,用户选定一个文件,压缩生成一个新文件,新文件文件名在原文件名扩展名后加.zip,如果用户选定的是一个文件夹,则递归压缩文件夹下文件及子文件夹下的所有文件,压缩包文件名为目录名+.zip。

Main.java

package FileTest;


import java.io.*;
import java.util.Base64;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;

class ZipUtil{
	
    public static void ZipFile (File oldFile) throws IOException {
        //被压缩的文件
        FileInputStream fileInputStream = new FileInputStream(oldFile);
        //输出的新压缩包
        String path = oldFile.getAbsolutePath();
        String newPath=path+".zip";
        File newFile = new File(newPath);
        //判断新压缩包是否已经存在
        if(!newFile.exists()) {
            //如果文件不存在就新建
        	System.out.println("压缩新文件不存在,新建");
            newFile.createNewFile();
        }else{
            //如果文件存在,则删除后重新创建新的文件
        	System.out.println("压缩新文件存在,则删除后重新创建新的文件");
            newFile.delete();
            newFile.createNewFile();
        }
        //原文件的输出流
        FileOutputStream fileOutputStream = new FileOutputStream(newFile);
        //原文件创建新的zip输出流
        ZipOutputStream zipOutputStream = new ZipOutputStream(fileOutputStream);
        //创建新的压缩文件
        ZipEntry zipEntry = new ZipEntry(oldFile.getName());
        //向新压缩包中添加文件,重新流定位,开始写入新的文件
        zipOutputStream.putNextEntry(zipEntry);
        //把原文件的内容写入压缩包中的新文件
        byte[] bytes = new byte[1024];
        int length;
        while((length=fileInputStream.read(bytes))!=-1){
            zipOutputStream.write(bytes,0,length);
        }
        //关闭输出输入文件流
        zipOutputStream.close();
        fileOutputStream.close();
        fileInputStream.close();
    }
    
    public static void ZipFolder(File ordFile,String ordFileName,ZipOutputStream zipOutputStream) throws IOException {
        //当前压缩对象是文件夹
        if(ordFile.isDirectory()){
            //遍历当前文件夹的子文件
            File[] listFiles = ordFile.listFiles();
            // 空文件夹的处理
            if(listFiles==null||listFiles.length<=0){
                zipOutputStream.putNextEntry(new ZipEntry(ordFile.getName()+"/"));
                //关闭当前zip条目读取下一条
                zipOutputStream.closeEntry();
            }
            else {
                for(File childFile:listFiles){
                    //递归,压缩对象变成子文件或子目录
                    // +"/"分级目录,保留原来的文件结构
                    ZipFolder(childFile,ordFileName+"/"+childFile.getName(),zipOutputStream);
                }
            }
        }else{
            //当前压缩对象不是文件夹,是文件
            //创建文件输入流
            FileInputStream fileInputStream = new FileInputStream(ordFile);
            //创建新的压缩条目
            ZipEntry zipEntry = new ZipEntry(ordFileName);
            //向新压缩包中添加文件,重新流定位,开始写入新的条目
            zipOutputStream.putNextEntry(zipEntry);
            //把原文件的内容写入压缩包中的新文件
            byte[] bytes = new byte[1024];
            int length;
            //子文件以字节码形式存储在新压缩包中
            while((length=fileInputStream.read(bytes))!=-1){
                zipOutputStream.write(bytes,0,length);
            }
            //关闭文件输入流,而zip输出流不关闭
            fileInputStream.close();
        }
    }
    
    static public void UnZipFile(File ordFile) throws IOException {
        //被解压文件的绝对路径
        String ordPath = ordFile.getAbsolutePath();
        //压缩包的输入流
        FileInputStream fileInputStream = new FileInputStream(ordFile);
        ZipInputStream zipInputStream = new ZipInputStream(fileInputStream);
        //获取压缩包中的条目文件
        ZipEntry nextEntry = zipInputStream.getNextEntry();
        //对每个压缩文件进行解密
        byte[] bytes = new byte[1024];
        while(nextEntry!=null){
            //把文件后缀名.zip删除
            String newPath = ordPath.replaceAll(".zip","");
            //创建新文件
            File newFile = new File(newPath, nextEntry.getName());
            File newFileParent = newFile.getParentFile();
            //判断新压缩包是否已经存在
            if(!newFileParent.exists()) {
                //如果文件不存在就新建
                newFileParent.mkdirs();
            }
            if(newFile.exists()){
                //如果文件存在,则删除后重新创建新的文件
                newFile.delete();
            }
            newFile.createNewFile();
            //新文件的输出流
            FileOutputStream fileOutputStream = new FileOutputStream(newFile);
            int length;
            //把zip文件内容输出到新文件中
            while((length=zipInputStream.read(bytes))!=-1){
                fileOutputStream.write(bytes,0,length);
            }
            //关闭当前新文件的输出流
            fileOutputStream.close();
            //获得压缩包下一个条目文件
            nextEntry = zipInputStream.getNextEntry();
        }
        //关闭zip输入流
        zipInputStream.closeEntry();
        zipInputStream.close();
    }
}

class Base64Util{
    //加密
    static public String EncodeBase64(String str){
        byte[] bytes = str.getBytes();
        String encode = Base64.getEncoder().encodeToString(bytes);
        return encode;
    }
    //解密
    static public  String DecodeBase64(String str){
        byte[] bytes = Base64.getDecoder().decode(str);
        String s = new String(bytes);
        return s;
    }
}
class FileUtil{
	
	 static public void FileToZip(String path) throws IOException {
	        File file = new File(path);
	        if(file.isDirectory()) {
	            System.out.println("压缩"+path+":isDirectory");
	            //新压缩包名
	            String newPath=path+".zip";
	            //新压缩包
	            FileOutputStream fileOutputStream = new FileOutputStream(newPath);
	            ZipOutputStream zipOutputStream = new ZipOutputStream(fileOutputStream);
	            //对文件夹进行递归压缩
	            ZipUtil.ZipFolder(file,file.getName(),zipOutputStream);
	            //关闭输出流
	            zipOutputStream.close();
	            fileOutputStream.close();
	        }else{
	            System.out.println("压缩"+path+":isFile");
	            ZipUtil.ZipFile(file);
	        }
    }
	
    static public void ZipToFile(String path) throws IOException {
    	System.out.println("解压:"+path);
        File file = new File(path);
        ZipUtil.UnZipFile(file);
    }
    
    static private BufferedReader bufferedReader;
    final static private boolean encode=true;
    final static private boolean decode=false;
    static private StringBuilder nowString=new StringBuilder("");
    //文件加密
    static public void EncodeFile(File file){
        String fileToString = FileToString(file);
        //加密
        String s = Base64Util.EncodeBase64(fileToString);
        //清空文件并重新写入
        ReWriteInfoForFile(file,s);
        System.out.println("文件"+file.getAbsolutePath()+"加密后:"+"\n"+s);
        //添加文件名后缀名
        ChangeSufFileName(file,true);
    }
    
    static public void  DecodeFile(File file){
        String fileToString = FileToString(file);
        String s = Base64Util.DecodeBase64(fileToString);
        //清空文件并重新写入
        ReWriteInfoForFile(file,s);
        System.out.println("文件"+file.getAbsolutePath()+"解密后:"+"\n"+s);
        ChangeSufFileName(file,false);
    }
    //修改文件名后缀名
    static public void ChangeSufFileName(File file,boolean isAdd){
        //文件名后加enc
        String fileName = file.getName();
        if(isAdd){
            fileName=fileName.substring(0, fileName.length()-4)+".enc"+fileName.substring(fileName.length()-4);
        }
        else {
            fileName=fileName.replaceAll(".enc", "");
        }
        String fileParent = file.getParent();
        //文件所在文件夹路径+新文件名
        String newPathName=fileParent+'\\'+fileName;
        file.renameTo(new File(newPathName));   //修改名后,原文件会被删除
        System.out.println("修改后的文件名为"+newPathName);
        //System.out.println("文件:"+file.getName()+":"+file.exists());
    }
    
    //文件转化成字符串
    static public String FileToString(File file){
        try {
            FileInputStream fileInputStream = new FileInputStream(file);
            StringBuilder stringBuilder=new StringBuilder();
            int length;
            byte[] buf = new byte[1024];
            //返回一个整型字符数据
            while((length=fileInputStream.read(buf))!=-1){
                stringBuilder.append(new String(buf,0,length));
            }
            String fileTextString = stringBuilder.toString();
            fileInputStream.close();
            return fileTextString;
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }
    
    public static void ReWriteInfoForFile(File file,String str) {
        try {
            if(!file.exists()) {
                file.createNewFile();
            }
            //清空文件
            FileWriter fileWriter =new FileWriter(file);
            fileWriter.write("");
            fileWriter.flush();
            fileWriter.close();
            //重新写入
            FileOutputStream fileOutputStream = new FileOutputStream(file);
            byte[] bytes = str.getBytes();
            fileOutputStream.write(bytes);
            fileOutputStream.flush();
            fileOutputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    //递归加密or解密
    static public void RecursiveEncodeOrDecode(String Path,boolean isEncode){
        File folder = new File(Path);
        if(!folder.exists()){
            System.out.println("文件"+Path+"不存在");
            return ;
        }
        if(!folder.isDirectory()){
            if(isEncode){
                System.out.println("文件"+Path+"进行加密");
                EncodeFile(folder);
            } else {
                System.out.println("文件"+Path+"进行解密");
                DecodeFile(folder);
            }
            return ;
        }
        File[] listFiles = folder.listFiles();
        if(null==listFiles||listFiles.length==0){
            System.out.println("文件夹"+Path+"为空");
            return ;
        }
        for(File file:listFiles) {
            if (file.isDirectory()) {
                System.out.println("文件夹" + file.getAbsolutePath() + "继续递归");
                RecursiveEncodeOrDecode(file.getAbsolutePath(),isEncode);
            } else {
                if(isEncode){
                    System.out.println("文件"+file.getAbsolutePath()+"进行加密");
                    EncodeFile(file);
                } else {
                    System.out.println("文件"+file.getAbsolutePath()+"进行解密");
                    DecodeFile(file);
                }
            }
        }
    }
}

public class Main {

//	public static void main(String[] args) {
//		String path="D:\\desktop\\Text\\123.txt";
//	    path="D:\\desktop\\Text\\123";
//	    //压缩
//	    FileUtil.FileToZip(path);
//	    path=path+".zip";
//	    //解压
//	    FileUtil.ZipToFile(path);
        //文件/文件夹路径
//        String Path="D:\\desktop\\Text";
//        //加密
//        FileUtil.RecursiveEncodeOrDecode(Path,true);
//        String s = FileUtil.FileToString(new File(Path));
//        System.out.println();
//        //解密
//        FileUtil.RecursiveEncodeOrDecode(Path,false);
//        String str = FileUtil.FileToString(new File(Path));
//    }
//	
	
}

Test.java

package FileTest;

import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JFileChooser;

import java.awt.Font;
import java.awt.Label;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JTextArea;
import java.awt.Choice;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.awt.Color;
import javax.swing.JLabel;

import FileTest.Main;

public class Test {

	private JFrame frame;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					Test window = new Test();
					window.frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the application.
	 */
	public Test() {
		initialize();
	}

	/**
	 * Initialize the contents of the frame.
	 */
	private void initialize()  {
		String fileName[]={""};
		frame = new JFrame();
		frame.getContentPane().setFont(new Font("宋体", Font.PLAIN, 20));
		frame.setBounds(100, 100, 817, 463);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.getContentPane().setLayout(null);
		
		
		JLabel lab = new JLabel("\u6587\u4EF6\u540D\uFF1A");
		lab.setFont(new Font("宋体", Font.PLAIN, 20));
		lab.setBounds(81, 10, 591, 25);
		frame.getContentPane().add(lab);
		
		JTextArea textArea = new JTextArea();
		textArea.setFont(new Font("Monospaced", Font.PLAIN, 13));
		textArea.setForeground(Color.BLACK);
		textArea.setEditable(false);
		textArea.setBounds(81, 39, 589, 272);
		frame.getContentPane().add(textArea);
		
		JButton btn2 = new JButton("\u538B\u7F29");
		btn2.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				try {
					FileUtil.FileToZip(fileName[0]);
					textArea.setText(fileName[0]+"压缩成功!");
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			}
		});
		btn2.setFont(new Font("宋体", Font.PLAIN, 20));
		btn2.setBounds(334, 321, 99, 33);
		frame.getContentPane().add(btn2);
		
		JButton btn22 = new JButton("\u89E3\u538B");
		btn22.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				try {
					FileUtil.ZipToFile(fileName[0]);
					textArea.setText(fileName[0]+"解压成功!");
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			}
		});
		btn22.setFont(new Font("宋体", Font.PLAIN, 20));
		btn22.setBounds(334, 364, 99, 33);
		frame.getContentPane().add(btn22);
		
		JButton btn3 = new JButton("\u52A0\u5BC6");
		btn3.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				long startTime = System.currentTimeMillis(); 
				//do something
				try {
					FileUtil.RecursiveEncodeOrDecode(fileName[0],true);
					textArea.setText(fileName[0]+"加密成功!");
				} catch (Exception e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
				long endTime = System.currentTimeMillis(); 
		    	System.out.println("程序运行时间:" + (endTime - startTime) + "ms");
			}
		});
		btn3.setFont(new Font("宋体", Font.PLAIN, 20));
		btn3.setBounds(575, 321, 99, 33);
		frame.getContentPane().add(btn3);
		
		JButton btn33 = new JButton("\u89E3\u5BC6");
		btn33.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				long startTime = System.currentTimeMillis(); 
				//do something
				try {
					FileUtil.RecursiveEncodeOrDecode(fileName[0],false);
					textArea.setText(fileName[0]+"解密成功!");
				} catch (Exception e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
				long endTime = System.currentTimeMillis(); 
		    	System.out.println("程序运行时间:" + (endTime - startTime) + "ms");
			}
		});
		btn33.setFont(new Font("宋体", Font.PLAIN, 20));
		btn33.setBounds(575, 364, 99, 33);
		frame.getContentPane().add(btn33);
		
		
		
		JButton btn1 = new JButton("\u6253\u5F00\u6587\u4EF6");
		btn1.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				JFileChooser jfc =new JFileChooser("D:\\desktop\\Text");
				jfc.showDialog(btn1, null);
				jfc.setFileSelectionMode(JFileChooser.FILES_ONLY);
				jfc.showOpenDialog(null);
				File file=jfc.getSelectedFile();
				fileName[0] = file.getAbsolutePath();
				lab.setText(fileName[0]);
				System.out.println(fileName[0]);
				//原文件的输出流
				FileInputStream fileInputStream = null;
				try {
					fileInputStream = new FileInputStream(file);
				} catch (FileNotFoundException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
		        StringBuilder textContent=new StringBuilder();
		        int length;
		        try {
					while((length=fileInputStream.read())!=-1){
					    textContent.append((char)(length));
					}
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
				textArea.setText(textContent.toString());
			}
		});
		btn1.setFont(new Font("宋体", Font.PLAIN, 20));
		btn1.setBounds(81, 321, 149, 33);
		frame.getContentPane().add(btn1);
		
		JButton btn11 = new JButton("\u6253\u5F00\u6587\u4EF6\u5939");
		btn11.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				JFileChooser jfc =new JFileChooser("D:\\desktop\\Text");
				jfc.showDialog(btn1, null);
				jfc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
				jfc.showOpenDialog(null);
				File file=jfc.getSelectedFile();
				fileName[0] = file.getAbsolutePath();
				lab.setText(fileName[0]);
				System.out.println(fileName[0]);
				textArea.setText("文件夹:"+fileName[0]);
			}
		});
		btn11.setFont(new Font("宋体", Font.PLAIN, 20));
		btn11.setBounds(81, 364, 149, 33);
		frame.getContentPane().add(btn11);
		
		
	}
}

上一篇:Java GUI编程(3)- 第一个Frame窗口


下一篇:《手把手教你》系列技巧篇(四十二)-java+ selenium自动化测试 - 处理iframe -下篇(详解教程)