Java通过流对文件加密

加密目标文件

代码如下:

不建议进行二次加密,若二次加密必须要二次解密

package com.xgt.util;
import java.io.*;
public class VideoEncodeUtil {

    public static void main(String[] args) throws Exception {
        encrypt("D:\\py交易\\11.mp4","fuckyourself");
        decrypt("D:\\py交易\\11.mp4","D:\\py交易\\22.mp4",4);
        System.out.println(readFileLastByte("D:\\py交易\\11.mp4",12));
    }
    /**
     * 文件file进行加密
     * @param fileUrl 文件路径
     * @param key 密码
     * @throws Exception
     */
    public static void encrypt(String fileUrl, String key) throws Exception {
        File file = new File(fileUrl);
        String path = file.getPath();
        if(!file.exists()){
            return;
        }
        int index = path.lastIndexOf("\\");
        String destFile = path.substring(0, index)+"\\"+"abc";
        File dest = new File(destFile);
        //获取待加密文件的输入流
        InputStream in = new FileInputStream(fileUrl);
        //创建中转文件输出流
        OutputStream out = new FileOutputStream(destFile);
        //待加密文件的流
        byte[] buffer = new byte[1024];
        int r;
        //加密之后的文件的流
        byte[] buffer2=new byte[1024];
        while (( r= in.read(buffer)) > 0) {
            for(int i=0;i<r;i++)
            {
                byte b=buffer[i];
                //buffer2[i]=b==255?0:++b;
                //每个字节加2加密
                b+=2;
                buffer2[i] = b;

            }
            out.write(buffer2, 0, r);
            out.flush();
        }
        in.close();
        out.close();
        file.delete();
        dest.renameTo(new File(fileUrl));
        appendMethodA(fileUrl, key);
        System.out.println("加密成功");
    }
    /**
     *
     * @param fileName
     * @param content 密钥
     */
    public static void appendMethodA(String fileName, String content) {
        try {
            // 打开一个随机访问文件流,按读写方式
            RandomAccessFile randomFile = new RandomAccessFile(fileName, "rw");
            // 文件长度,字节数
            long fileLength = randomFile.length();
            //将写文件指针移到文件尾。
            randomFile.seek(fileLength);
            randomFile.writeBytes(content);
            randomFile.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    /**
     * 解密
     * @param fileUrl 源文件
     * @param tempUrl 临时文件
     * @param keyLength 密码长度
     * @return
     * @throws Exception
     */
    public static String decrypt(String fileUrl, String tempUrl, int keyLength) throws Exception{
        File file = new File(fileUrl);
        if (!file.exists()) {
            return null;
        }
        File dest = new File(tempUrl);
        if (!dest.getParentFile().exists()) {
            dest.getParentFile().mkdirs();
        }
        //获取待解密的文件输入流
        InputStream is = new FileInputStream(fileUrl);
        //创建目标文件输出流,用来生成解密后的文件
        OutputStream out = new FileOutputStream(tempUrl);
        byte[] buffer = new byte[1024];
        byte[] buffer2=new byte[1024];
        byte bMax=(byte)255;
        long size = file.length() - keyLength;
        int mod = (int) (size%1024);
        int div = (int) (size>>10);
        int count = mod==0?div:(div+1);
        int k = 1, r;
        while ((k <= count && ( r = is.read(buffer)) > 0)) {
            if(mod != 0 && k==count) {
                r = mod;
            }
            for(int i = 0;i < r;i++)
            {
                byte b=buffer[i];
                //buffer2[i]=b==0?bMax:--b;
                //每个字节减2解码
                b-=2;
                buffer2[i] = b;

            }
            out.write(buffer2, 0, r);
            k++;
        }
        out.close();
        is.close();
        return tempUrl;
    }
    /**
     * 判断文件是否加密
     * @param fileName
     * @return
     *
     * 加密成功返回key
     * 加密失败返回非key的字符串
     */
    public static String readFileLastByte(String fileName, int keyLength) {
        File file = new File(fileName);
        if(!file.exists())return "没有文件";
        StringBuffer str = new StringBuffer();
        try {
            // 打开一个随机访问文件流,按读写方式
            RandomAccessFile randomFile = new RandomAccessFile(fileName, "rw");
            // 文件长度,字节数
            long fileLength = randomFile.length();
            //将写文件指针移到文件尾。
            for(int i = keyLength ; i>=1 ; i--){
                randomFile.seek(fileLength-i);
                str.append((char)randomFile.read());
            }
            randomFile.close();
            return str.toString();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "异常";
    }
}

原文地址:https://www.cnblogs.com/Java-Starter/p/9300292.html

时间: 2024-11-12 05:57:48

Java通过流对文件加密的相关文章

Java:IO流与文件基础

Java:IO流与文件基础 说明: 本文所有内容包含图片均为MrSaber自己编写,转载请练习我哦. 本章内容将会持续更新,大家可以关注一下并给我提供建议,谢谢啦. 走进流 什么是流 流:从源到目的地的字节的有序序列. 在Java中,可以从其中读取一个字节序列的对象称作 输入流,可以向其中写入一个字节序列的对象称作 输出流. ? 这些字节序列的来源可以是:文件.网络连接.内存块等. ? 抽象类InputStream和OutputStream是构成输入/输出(I/O)的基础. ? 因为面向字节的流

java io流 创建文件、写入数据、设置输出位置

java io流 创建文件 写入数据 改变system.out.print的输出位置 //创建文件 //写入数据 //改变system.out.print的输出位置 import java.io.*; public class Index{ public static void main(String[] args) throws Exception{ /** * 存储为二进制,给计算机看的 */ //创建文件 DataOutputStream sjl = new DataOutputStrea

关于java io流操作文件探讨

1.任务描述    2.读取一个字符 3.读取整个文件 4.复制文件 5.复制大文件 6.利用字符流解决乱码问题 一.任务描述 大家都知道程序是程序的运行是离不开内存的,但是很多东西并不在程序当中,而程序也需要操作它们.所以就需要一个东西与内存外的资源打交道,我们就把这个东西称为io流.io流分为输出流和输入流,输出流是将内存中的东西输出到内存之外,输入流是将内存之外的东西读取到内存中.一旦有了io流之后,与内存之外的资源打交道就十分方便了.为什么这么说,其实总体上就只需要三步操作,第一步,定位

Java 运用流传输文件

实例1 package IO; import java.io.FileReader; import java.io.FileWriter; import java.io.Reader; import java.io.Writer; /** * 案例:利用字符流实现字符文件的拷贝1.txt -> 3.txt * 1.字符文件的读取:FileReader * 2.字符文件的写入:FileWriter * 3.循环上面的过程 */ public class FileCopyDemo1 { public

Java IO流和文件操作

Java.io 包几乎包含了所有操作输入.输出需要的类.所有这些流类代表了输入源和输出目标. Java.io 包中的流支持很多种格式,比如:基本类型.对象.本地化字符集等等. 一个流可以理解为一个数据的序列.输入流表示从一个源读取数据,输出流表示向一个目标写数据. Java 为 I/O 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中. 控制台输入 BufferedReader br = new BufferedReader(new InputStreamReader(Syste

java io流与文件操作

Java的文件操作 File类位于java.io包中 我们可以使用File操作文件 首先创建对象 File file=new File("路径")//关联文件 创建文件:file.createNewFile()//首先这里会抛异常需要try...catch处理,其次如果有同名文件则不会创建. 创建文件夹:file.mkdir文件操作 File类位于java.io包中 我们可以使用File操作文件 首先创建对象 File file=new File("路径")//关联

Java IO流 之 文件复制

http://www.verejava.com/?id=16994676228912 package com.io; import java.io.*; public class TestCopy { public static void main(String[] args) { InputStream is=null; OutputStream os=null; try { //读取文件 english.txt is=new FileInputStream(new File("res/1.p

Java 字符流读写文件

据说,java读写文件要写很多,贼麻烦,不像c艹,几行代码就搞定.只能抄抄模板拿来用了. 输入输出流分字节流和字符流.先看看字符流的操作,字节转化为字符也可读写. 一.写入文件 1.FileWriter类: FileWriter fw=new FileWriter("hello");//在workspace工作空间里创建文件,文件名为hello FileWriter fw=new FileWriter("E:\\hello");//在E盘创建文件,文件名为hello

java Io流更新文件内容

package com.hp.io; import java.io.FileOutputStream; import java.io.IOException; public class FileOutputStreamTest{ public static void main(String []args){ FileOutputStream fos=null;    //文件输出流 try{ String str="java从入门到放弃"; byte [] words =str.get