广州大学《网络编程》第二讲作业 —— 文件加密/压缩文件

作业要求

在这里插入图片描述
在这里插入图片描述

作业难点

  • 文件转换为字符串,并对字符串进行加密,加密后进行解密
  • 文件的递归读取
  • 文件的压缩,Zip流的使用

作业代码

作业1

本代码参考意义价值不大,文件读取较为冗余,用于博主本人记录。
里面字符串加密的工具转载于为“com.openailab.oascloud.gateway.util.EncryptUtil”
作者为:zxzhang

public class EncryptOrDecipher {

    public static void main(String[] args) {

        Scanner in = new Scanner(System.in);
        int mode = 0;
        String pathName = "";
        int method = 0;
        System.out.println("请输入您需要加密还是解密?1、加密,2、解密");
        mode = in.nextInt();
        String keyString = "";
        if(mode == 1){
            System.out.println("请输入您需要加密的文件/文件夹");
            pathName = in.next();
            System.out.println("请输入您需要加密的方式:1、BASE 64加密;2、DES 加密");
            method = in.nextInt();
            File fileInput = new File(pathName);
            if(method == 2){
                System.out.println("您选择的是DES加密,请输入一个秘钥(请务必记住):");
                keyString = in.next();
            }
            if(!fileInput.isDirectory()){
                encryptDocument(fileInput, fileInput.getParent(), method,keyString);
            }else{
                encryptFile(fileInput, fileInput.getParent(), method,keyString);
            }
        }else if(mode == 2){
            System.out.println("请注意!解压后的绝对路径文件若已经存在,会进行覆盖");
            System.out.println("请输入您需要解密的文件/文件夹");
            pathName = in.next();
            System.out.println("请输入您需要解密的方式:1、BASE 64解密;2、DES 解密");
            method = in.nextInt();
            if(method == 2){
                System.out.println("您选择的是DES解密,请输入一个秘钥(请务必记住):");
                keyString = in.next();
            }
            File fileInput = new File(pathName);
            if(!fileInput.isDirectory()){
                decipherDocument(fileInput, fileInput.getParent(), method,keyString);
            }else{
                decipherFile(fileInput, fileInput.getParent(), method,keyString);
            }
        }
    }

    //加密文件
    //参数:加密文件,加密方法
    public static void encryptDocument(File fileInput,String fileInputPathParent,int encryptMethod,String keyString){
        String[]  fileNames = fileInput.getName().split("\\.");
        String encryptAbsolutePath = fileInputPathParent+"\\"+fileNames[0]+"enc"+"."+fileNames[1];
        System.out.println("您要加密的文件存放的绝对路径:"+encryptAbsolutePath);
        FileInputStream fileInputStream =null;
        FileOutputStream fileOutputStream = null;
        try {
            //输入流
            fileInputStream = new FileInputStream(fileInput);
            //输出流
            fileOutputStream = new FileOutputStream(new File(encryptAbsolutePath));
            int size = fileInputStream.available();
            byte[] buffer = new byte[size];
            fileInputStream.read(buffer);
            String strBforEnc = byToString(buffer);

            //分三种不同的情况进行加密
            if(encryptMethod == 1){
                String encryptStrByBase64 = EncryptUtil.encryptByBase64(strBforEnc);
                byte[] bytesAfterEnc = StringToBy(encryptStrByBase64);
                fileOutputStream.write(bytesAfterEnc);
            }else if(encryptMethod == 2){
                String encryptStrByDes = EncryptUtil.encryptByDes(strBforEnc,StringToBy(keyString));
                byte[] bytesAfterEnc = StringToBy(encryptStrByDes);
                fileOutputStream.write(bytesAfterEnc);
            }else{

            }

            fileOutputStream.close();
            fileInputStream.close();
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    public static void encryptFile(File fileInput,String fileInputPathParent,int encryptMethod,String keyString){
        File[] files = fileInput.listFiles();
        String encryPath = fileInputPathParent+"\\"+fileInput.getName()+"enc";
        File encryFile = new File(encryPath);
        if(!encryFile.exists()){
            encryFile.mkdir();
        }
        //递归下去加密
        for (File file : files) {
            if(!file.isDirectory()){
                encryptDocument(file,encryFile.getAbsolutePath(),encryptMethod,keyString);
            }else{
                encryptFile(file,encryFile.getAbsolutePath(),encryptMethod,keyString);
            }
        }
    }


    //解密文件
    public static void decipherDocument(File fileInput,String fileInputPathParent,int encryptMethod,String keyString){
        String[]  fileNames = fileInput.getName().split("\\.");
        int len = fileNames[0].length();
        String encryptAbsolutePath = fileInputPathParent+"\\"+fileNames[0].substring(0,len-3)+"."+fileNames[1];
        System.out.println("您要解密的文件存放的绝对路径:"+encryptAbsolutePath);
        FileInputStream fileInputStream =null;
        FileOutputStream fileOutputStream = null;
        try {
            //输入流
            fileInputStream = new FileInputStream(fileInput);
            //输出流
            fileOutputStream = new FileOutputStream(new File(encryptAbsolutePath));
            int size = fileInputStream.available();
            byte[] buffer = new byte[size];
            fileInputStream.read(buffer);
            String strAfterEnc = byToString(buffer);

            //分三种不同的情况进行解密
            if(encryptMethod == 1){
                String decryptByBase64 = EncryptUtil.decryptByBase64(strAfterEnc);
                byte[] bytesBeforEnc = StringToBy(decryptByBase64);
                fileOutputStream.write(bytesBeforEnc);
            }else if(encryptMethod == 2){
                String decryptByDES = EncryptUtil.decryptByDes(strAfterEnc,StringToBy(keyString));
                byte[] bytesAfterEnc = StringToBy(decryptByDES);
                fileOutputStream.write(bytesAfterEnc);
            }else{

            }

            fileOutputStream.close();
            fileInputStream.close();
        }catch (IOException e){
            e.printStackTrace();
        }
    }


    //解密文件夹
    public static void decipherFile(File fileInput,String fileInputPathParent,int encryptMethod,String keyString){
        File[] files = fileInput.listFiles();
        int len = fileInput.getName().length();
        String decryPath = fileInputPathParent+"\\"+fileInput.getName().substring(0,len-3);
        File decryFile = new File(decryPath);
        if(!decryFile.exists()){
            decryFile.mkdir();
        }
        //递归下去加密
        for (File file : files) {
            if(!file.isDirectory()){
                decipherDocument(file,decryFile.getAbsolutePath(),encryptMethod,keyString);
            }else{
                decipherFile(file,decryFile.getAbsolutePath(),encryptMethod,keyString);
            }
        }
    }

    //byte数组转换为String
    public static String byToString(byte[] buff){
        int size = buff.length;
        char[] byToChs = new char[size];
        for(int i =0;i<size;i++){
            byToChs[i] = (char) buff[i];
        }
        StringBuilder sb = new StringBuilder();
        sb.append(byToChs);
        String str = sb.toString();
        return str;
    }

    //String转换为byte数组
    public static byte[] StringToBy(String str){
        char[] strTochs = str.toCharArray();
        int size = strTochs.length;
        byte[] buffer = new byte[size];
        for(int i = 0;i<size;i++){
            buffer[i] = (byte) strTochs[i];
        }
        return buffer;
    }

课后作业2

public class ZipFile {

    public void zip(String zipFileName,File inputFile) throws Exception{
        ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFileName));
        zip(out,inputFile,"");
        out.close();
    }

    public void zip(ZipOutputStream out,File inputFile,String base) throws Exception{
        if(inputFile.isDirectory()){
            File[] files = inputFile.listFiles();
//            out.putNextEntry(new ZipEntry(base+"/"));
            base = base.length() == 0 ? "":base+"/";
            for (File file : files) {
                System.out.println(file);
                zip(out,file,base+file.getName());
            }
        }else {
            out.putNextEntry(new ZipEntry(base));
            FileInputStream fin = new FileInputStream(inputFile);
            int by;
            System.out.println(base);
            while((by=fin.read())!= -1){
                out.write(by);
            }
            fin.close();
        }
    }


    public static void main(String[] args) {
        ZipFile zipFile = new ZipFile();
        try{
            System.out.println("请输入你想要压缩的文件/文件夹的绝对路径:");
            Scanner in = new Scanner(System.in);
            String path = in.next();
            System.out.println("压缩中");
            zipFile.zip("zipFile.zip",new File(path));
            System.out.println("压缩完成");
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

此代码参考博客
点击此处
略带修改,该博文解释的相当清楚,学习之。

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值