Java利用字节型文件流进行文件的复制粘贴,文件加密与解密

文件的复制粘贴

需求:把文件从F盘复制到E盘
在这里插入图片描述
在这里插入图片描述

package com.rjxy;

import java.io.*;

public class FileOperation {
    //一边读取一边写入
    public void copyFile(String path,String objpath){
        File file = new File(path);
        String newPath = objpath+"\\"+file.getName();
        //为了复制的安全性,一定要判断一下
        if (path.equalsIgnoreCase(newPath)){
            //因为是边读边写
            System.err.println("要复制的文件路径绝对不能和目标路径一致,否则会发生不可逆的文件损坏或丢失");
            return;
        }
        FileInputStream fis = null;
        FileOutputStream fos = null;
        try {
            fis = new FileInputStream(file);
            fos = new FileOutputStream(newPath);
            byte bytes[] = new byte[1024];//通常我们每次读取 1kb--8kb 之间为宜,我们选1kb试试(1024字节)
            int count = fis.read(bytes);
            while (count!=-1){
                fos.write(bytes,0,count);
                fos.flush();
                count = fis.read(bytes);
            }
            System.out.println("复制完毕");
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            //为了代码的健壮性,关闭输入流和输出流时应该分开写:
            try {
                if (fis!=null) {
                    fis.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if (fos!=null) {
                    fos.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    public static void main(String[] args) {
        FileOperation fc = new FileOperation();
        //需要给出要复制的文件路径和文件名称,目标文件存放路径
        fc.copyFile("F:\\test\\国外留学.pdf","E:\\test");
    }
}

执行结果:
在这里插入图片描述
并且文件没有损坏,与原文件保持同样大小。

文件加密与解密

学会了文件的复制,文件的加密就变得超级简单,执行过程都一样,只需要在写入时候,给某些字节或全部字节做些手脚,让复制后的文件不能正常打开,它会提示文件已损坏。
加密还要是可逆的,即文件的解密。
怎样设计一个优秀的加密算法,既可以使得加密的过程可逆,又可以保证加密算法足够强大不会让别人随意破解,那就成了问题。

各种Java加密算法

这里我就随便设计了一个针对字节的文件加密算法:

    //加密encryption/encode
    public static byte[] encryption(byte[] bytes){
        /**
         * 设置一个加密算法,要求可逆,还可以通过解密得到原来的东西
         * 我们这样做:每一个字节的值,都加上它的索引号
         * 然后,交换第一个字节和最后一个字节的位置,即解密结束
         */
        for (int i = 0;i<bytes.length;i++){
            bytes[i] = (byte)(bytes[i]+i);
        }
        byte temp = bytes[0];
        bytes[0] = bytes[bytes.length-1];
        bytes[bytes.length-1] = temp;
        return bytes;

    }
    //解密Decryption/decode
    public static byte[] decryption(byte[] bytes){
        /**
         * 解密算法,是加密的逆过程
         * 先交换第一个字节和最后一个字节的位置
         * 然后,每一个字节的值,都减去它的索引号
         */
        byte temp = bytes[0];
        bytes[0] = bytes[bytes.length-1];
        bytes[bytes.length-1] = temp;
        for (int i = 0;i<bytes.length;i++){
            bytes[i] = (byte)(bytes[i]-i);
        }
        return bytes;
    }

进行文件加密:
在F盘我们准备了这样的一个视频文件:
在这里插入图片描述
在E盘我们保证test文件夹存在:
在这里插入图片描述
代码:

    //文件加密
    public void fileEncrypOption(String filepath,String objpath,boolean isEncryp){
        File file = new File(filepath);
        File newFile = new File(objpath);
        FileInputStream fis = null;
        FileOutputStream fos = null;
        try {
            fis = new FileInputStream(file);
            fos = new FileOutputStream(newFile);
            byte[] bytes = new byte[1024];
            int count = fis.read(bytes);
            while (count!=-1){
                if (isEncryp){//加密
                    if (count==bytes.length){
                        fos.write(FileOperation.encryption(bytes));
                    }else {
                        byte[] b = new byte[count];
                        for (int i = 0;i<b.length;i++){
                            b[i] = bytes[i];
                        }
                        fos.write(FileOperation.encryption(b));
                    }
                }else {//解密
                    if (count==bytes.length){
                        fos.write(FileOperation.decryption(bytes));
                    }else {
                        byte[] b = new byte[count];
                        for (int i = 0;i<b.length;i++){
                            b[i] = bytes[i];
                        }
                        fos.write(FileOperation.decryption(b));
                    }
                }
                fos.flush();
                count = fis.read(bytes);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if (fis!=null) {
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (fos!=null) {
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

main方法:

    public static void main(String[] args) {
        FileOperation fc = new FileOperation();
        String path = "F:\\test\\快手.mp4";
        String objPath = "E:\\test\\快手.mp4";
        fc.fileEncrypOption(path,objPath,true);//加密
    }

执行结果:
在这里插入图片描述
同时这个视频是无法播放的:
在这里插入图片描述
解密:

    public static void main(String[] args) {
        FileOperation fc = new FileOperation();
        String path = "F:\\test\\快手.mp4";
        String objPath = "E:\\test\\快手.mp4";
        //fc.fileEncrypOption(path,objPath,true);//加密
        fc.fileEncrypOption(objPath,path,false);//解密
    }

解密成功:
在这里插入图片描述

发布了76 篇原创文章 · 获赞 57 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_43598138/article/details/105714485