我们知道文件存储的方式在计算机当中是以字节的方式进行存储的,可以通过对文件字节的操作来实现文件的加密。

下面的例子是通过读取文件的字节,然后使字节中的每一位取反(1变0,0变1),再进行倒置,来实现加解密过程。

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Arrays;
/**
* @author 朱俊伟
* @date 2020/11/15
*/
public class FileEncrytionTest
{
public static void main(String[] args)
{
//源文件
File file1 = new File("D:\\系统文件夹\\桌面\\test.txt");
//加密文件
File file2 = new File("D:\\系统文件夹\\桌面\\myenc.txt");
//解密文件
File file3 = new File("D:\\系统文件夹\\桌面\\mydec.txt");
//加密方法
EnFile(file1,file2);
//解密方法
DecFile(file2,file3);
} //加密方法
public static void EnFile(File srcFile,File tarFile)
{
BufferedInputStream bis = null;
BufferedOutputStream bos = null ;
//源文件
File file1 = srcFile;
//加密文件
File file2 = tarFile;
try
{
InputStream is = new FileInputStream(file1);
OutputStream os = new FileOutputStream(file2);
bis = new BufferedInputStream(is);
bos = new BufferedOutputStream(os); byte[] data = new byte[100];
int len = 0 ;
while((len = bis.read(data))!= -1)
{
byte[] temp = Arrays.copyOfRange(data,0,len);
System.out.println("加密读取:"+Arrays.toString(temp));
bos.write(reverseArray(temp));
System.out.println("加密写入:"+Arrays.toString(temp));
} } catch ( Exception e)
{
e.printStackTrace();
} finally
{
try
{
if(bis != null)
{
/* 关闭管子 */
bis.close();
bis = null ;
}
}catch(IOException e)
{
e.printStackTrace();
} try
{
if(bos != null)
{
/* 关闭管子 */
bos.close();
bos = null ;
}
}catch(IOException e)
{
e.printStackTrace();
}
}
}
//解密方法
public static void DecFile(File srcFile,File tarFile)
{
BufferedInputStream bis = null;
BufferedOutputStream bos = null ;
//源加密文件
File file1 = srcFile;
//解密文件
File file2 = tarFile;
try
{
InputStream is = new FileInputStream(file1);
OutputStream os = new FileOutputStream(file2);
bis = new BufferedInputStream(is);
bos = new BufferedOutputStream(os); byte[] data = new byte[100];
int len = 0 ;
while((len = bis.read(data))!= -1)
{
byte[] temp = Arrays.copyOfRange(data,0,len);
System.out.println("解密读取:"+Arrays.toString(temp));
bos.write(reverseArray(temp));
System.out.println("解密写入:"+Arrays.toString(temp));
} } catch ( Exception e)
{
e.printStackTrace();
} finally
{
try
{
if(bis != null)
{
/* 关闭管子 */
bis.close();
bis = null ;
}
}catch(IOException e)
{
e.printStackTrace();
} try
{
if(bos != null)
{
/* 关闭管子 */
bos.close();
bos = null ;
}
}catch(IOException e)
{
e.printStackTrace();
}
}
} /**
* 字节数组的各位取反,并倒置
* @param bytes
* @return
*/
public static byte[] reverseArray(byte[] bytes){
for (int i=0; i<bytes.length/2; i++){
byte b = (byte) ~bytes[i];
bytes[i] = (byte) ~bytes[bytes.length-i-1];
bytes[bytes.length-i-1] = b;
}
return bytes;
}
}

控制台打印

三个文件对比。

Java IO--实现文件的加密解密的更多相关文章

  1. C# 加密(Encrypt) 解密(Decrypt) 操作类 java与 C# 可以相互加密解密

    public sealed class EncryptUtils { #region Base64加密解密 /// <summary> /// Base64加密 /// </summ ...

  2. Java IO :文件

    在java应用程序中,文件是一种常用的数据源或者存储数据的媒介.所以这一小节将会对Java中文件的使用做一个简短的概述.这里只提供一些必要的知识点. 通过Java IO读文件 如果你需要在不同端之间读 ...

  3. java io读写文件

    java io读写文件相关阅读:http://www.cnblogs.com/wing011203/archive/2013/05/03/3056535.html public class DemoI ...

  4. java(IO)读写文件乱码转换UTF-8问题

    java(IO)读写文件乱码转换UTF-8问题 读取文件 String Content = ""; // 文件很长的话建议使用StringBuffer try { FileInpu ...

  5. java DES转C#DES加密解密

    一个程序用到java的cn.core.jar加密的,需要在.NET 中解密,发现JAVA的des算法与C#的有点区别. 自己不太懂加密解密算法,所以找了个省事的方法,用IKVM.NET,用这个将cn. ...

  6. DES加密 java与.net可以相互加密解密两种方法

    DES加密 java与.net可以相互加密解密两种方法 https://www.cnblogs.com/DrWang/archive/2011/03/30/2000124.html sun.misc. ...

  7. Java IO 流-- 文件拷贝

    IO流操作套路: 1.创建源: 2.选择流: 3.操作: 4.释放资源 上代码: package com.xzlf.io; import java.io.File; import java.io.Fi ...

  8. java对压缩文件进行加密,winrar和好压 直接输入解密密码来使用

    <!-- https://mvnrepository.com/artifact/net.lingala.zip4j/zip4j --> <dependency> <gro ...

  9. java使用RSA与AES加密解密

    首先了解下,什么是堆成加密,什么是非对称加密? 对称加密:加密与解密的密钥是相同的,加解密速度很快,比如AES 非对称加密:加密与解密的秘钥是不同的,速度较慢,比如RSA 先看代码(先会用在研究) 相 ...

  10. 【推荐】JAVA基础◆浅谈3DES加密解密

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

随机推荐

  1. nmcli命令

    nmcli命令详解 nmcli命令是可以完成网卡上的所有配置,并可以写入配置文件中. 在NM里,有2个维度:连接(connection)和设备(device),这是多对一的关系.想给某个网卡配ip,首 ...

  2. 【忍者算法】从公路跑步到链表成环:探索环形链表检测|LeetCode第141题 环形链表

    从公路跑步到链表成环:探索环形链表检测 生活中的环形 想象两个人在环形跑道上跑步,一个跑得快,一个跑得慢.如果他们一直跑下去,快的跑者一定会从后面追上慢的跑者.这就是我们今天要讨论的环形链表问题的现实 ...

  3. ABB机器人3HNE00313-1示教器黑屏故障维修

    随着工业自动化的快速发展,ABB机器人示教器在生产线上的应用越来越广泛.然而,在使用过程中,示教器偶尔也会出现故障,其中比较常见的一种是ABB工业机械手示教器黑屏故障. 一.ABB工业机器人示教盒黑屏 ...

  4. Flink学习(十四) Flink 窗口、时间和水位线

    Flink 框架中支持事件时间.摄入时间和处理时间三种.而当我们在流式计算环境中数据从 Source 产生,再到转换和输出,这个过程由于网络和反压的原因会导致消息乱序.因此,需要有一个机制来解决这个问 ...

  5. FastAPI路由:微服务架构下的路由艺术与工程实践 🌐

    title: FastAPI路由专家课:微服务架构下的路由艺术与工程实践 date: 2025/3/4 updated: 2025/3/4 author: cmdragon excerpt: 用API ...

  6. go mod 安装bee 报错

    报错信息 go: github.com/beego/bee imports github.com/beego/bee/cmd imports github.com/beego/bee/cmd/comm ...

  7. SSH远程神器—Termius

    简介 Termius是一款非常好用而且漂亮的SSH客户端,能快速远程控制服务器,可以定制自己喜欢的主题.Termius不仅涵盖了PC端的Windows.Linux.Mac,还支持手机端的Android ...

  8. Docker中在不同网段下的容器的互联

    首先要启动docker: 拉取busybox镜像: 查看本地是否有这个镜像的命令是: 接下来咱们就要来查询docker的网络: 你会看到一个docker0 这是docker默认的网段,在docker里 ...

  9. Docker管理面板系列——Portainer

    一.介绍 Portainer是个轻量级的Docker管理面板,和Rancher这种重量级选手没法比,Portainer倾向于单机的管理(后来发现能够添加多个单机节点切换着管理),当然,在Docker搞 ...

  10. oracle调整sga、pga大小

    展开修改sga大小1-1查看当前sga大小SQL> show parameter sga1-2修改sga_max_size为24GSQL> alter system set sga_max ...