加密文件之Java改进版
对应Python版:加密文件之Python版
Java版比Python版要快得多,两个版本不在一个量级上。在加密解密1G大文件时,Java版花费的时间是秒级,而Python版花费的时间是10分钟级。
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.charset.Charset; /**
* Script: Encode.java Encode file or decode file. Java implementation and
* upgrade Encoding: UTF-8 Version: 0.2 Java version: 1.8 Usage: java Encode
* [encode | decode] filename [key]
*
*/
public class Encode { private static final String DEFAULT_KEY = "TESTKEY";
private static final String DEFAULT_CHARSET = "UTF-8";
private static final long SLEEP_TIME = 100; public boolean isEncode;
public MappedByteBuffer mappedBuffer; private String filename;
private String charset;
private byte[] keyBytes; private EncodeThread[] workThreads; public Encode(boolean isEncode, String filename, String key) {
this.isEncode = isEncode;
this.filename = filename;
this.charset = DEFAULT_CHARSET;
this.keyBytes = key.getBytes(Charset.forName(charset));
} public void run() {
try {
// read file
RandomAccessFile raf = new RandomAccessFile(filename, "rw");
FileChannel channel = raf.getChannel();
long fileLength = channel.size();
int bufferCount = (int) Math.ceil((double) fileLength / (double) Integer.MAX_VALUE);
if (bufferCount == 0) {
channel.close();
raf.close();
return;
}
int bufferIndex = 0;
long preLength = 0;
// repeat part
long regionSize = Integer.MAX_VALUE;
if (fileLength - preLength < Integer.MAX_VALUE) {
regionSize = fileLength - preLength;
}
mappedBuffer = channel.map(FileChannel.MapMode.READ_WRITE, preLength, regionSize);
preLength += regionSize; // create work threads
int threadCount = keyBytes.length; System.out.println(
"File size: " + fileLength + ", buffer count: " + bufferCount + ", thread count: " + threadCount);
long startTime = System.currentTimeMillis();
System.out.println("Start time: " + startTime + "ms");
System.out.println("Buffer " + bufferIndex + " start ..."); workThreads = new EncodeThread[threadCount];
for (int i = 0; i < threadCount; i++) {
workThreads[i] = new EncodeThread(this, keyBytes[i], keyBytes.length, i);
workThreads[i].start();
} // loop
while (true) {
Thread.sleep(SLEEP_TIME); // wait until all threads completed
boolean completed = true;
for (int i = 0; i < workThreads.length; i++) {
if (!workThreads[i].isCompleted()) {
completed = false;
break;
}
}
if (!completed) {
continue;
} // check if finished
bufferIndex++;
if (bufferIndex >= bufferCount) {
// stop threads
for (int i = 0; i < workThreads.length; i++) {
workThreads[i].flag = false;
}
break;
} // repeat part
regionSize = Integer.MAX_VALUE;
if (fileLength - preLength < Integer.MAX_VALUE) {
regionSize = fileLength - preLength;
}
mappedBuffer = channel.map(FileChannel.MapMode.READ_WRITE, preLength, regionSize);
preLength += regionSize; // restart threads
System.out.println("Buffer " + bufferIndex + " start ...");
for (int i = 0; i < workThreads.length; i++) {
workThreads[i].restart();
}
} // over loop
while (true) {
Thread.sleep(SLEEP_TIME); boolean isOver = true;
for (int i = 0; i < workThreads.length; i++) {
if (workThreads[i].isAlive()) {
isOver = false;
break;
}
}
if (isOver) {
break;
}
} // close file relatives
channel.close();
raf.close(); long endTime = System.currentTimeMillis();
System.out.println("End time: " + endTime + "ms, use time: " + (endTime - startTime) + "ms");
System.out.println("ok!");
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
} public static void main(String[] args) {
String usage = "Usage: java -jar encode.jar [encode | decode] filename [key]";
// parse args
if (args.length < 2) {
System.out.println("There must be two or more arguments!");
System.out.println(usage);
return;
}
if (!args[0].equals("encode") && !args[0].equals("decode")) {
System.out.println("The first argument must be \"encode\" or \"decode\"");
System.out.println(usage);
return;
}
boolean isEncode = (args[0].equals("encode"));
String filename = args[1];
File file = new File(filename);
if (!file.isFile()) {
System.out.println("The file doesn't exist!");
System.out.println(usage);
return;
}
String key = DEFAULT_KEY;
if (args.length > 2) {
key = args[2];
} // encode or decode
new Encode(isEncode, filename, key).run();
} } class EncodeThread extends Thread { private static final long SLEEP_TIME = 50; public boolean flag; private Encode encoder;
private int key;
private long dataIndex;
private int interval;
private int regionSize;
private boolean completed; public EncodeThread(Encode encoder, byte key, int interval, int index) {
this.encoder = encoder;
this.key = key & 0xff;
this.dataIndex = index;
this.interval = interval;
this.regionSize = encoder.mappedBuffer.limit();
this.completed = false;
this.flag = true;
} public void restart() {
this.dataIndex -= regionSize;
regionSize = encoder.mappedBuffer.limit();
completed = false;
} public boolean isCompleted() {
return completed;
} @Override
public void run() {
try {
if (encoder.isEncode) {
encode();
} else {
decode();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
} private void encode() throws InterruptedException {
while (flag) {
// completed here ensure restart() synchronized
if (completed) {
Thread.sleep(SLEEP_TIME);
continue;
}
if (dataIndex >= regionSize) {
completed = true;
System.out.println("Encode thread " + this.getName() + " is completed!");
continue;
} // do encode
byte b = encoder.mappedBuffer.get((int) dataIndex);
// added as unsigned byte
b = (byte) (((b & 0xff) + key) % 256);
encoder.mappedBuffer.put((int) dataIndex, b);
dataIndex += interval;
}
} private void decode() throws InterruptedException {
while (flag) {
// completed here ensure restart() synchronized
if (completed) {
Thread.sleep(SLEEP_TIME);
continue;
}
if (dataIndex >= regionSize) {
completed = true;
System.out.println("Encode thread " + this.getName() + " is completed!");
continue;
} // do decode
byte b = encoder.mappedBuffer.get((int) dataIndex);
// substracted as unsigned byte
b = (byte) (((b & 0xff) + 256 - key) % 256);
encoder.mappedBuffer.put((int) dataIndex, b);
dataIndex += interval;
}
} }
加密文件之Java改进版的更多相关文章
- java基础IO流 复制键盘录入的目录,复制其中的.java文件到指定目录,指定目录中有重名,则改名 对加密文件计算字母个数
package com.swift.jinji; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; im ...
- (iOS)Base64加密和DES加密、以及JAVA和iOS中DES加密统一性问题
我们在项目中为了安全方面的考虑,通常情况下会选择一种加密方式对需要安全性的文本进行加密,而Base64加密和DES64加密是常用的加密算法.我记得我在前一个项目中使用的就是这两种加密算法的结合:Bas ...
- 运用加密技术保护Java源代码/定制ClassLoader
为什么要加密? 对于传统的C或C++之类的语言来说,要在Web上保护源代码是很容易的,只要不发布它就可以.遗憾的是,Java程序的源代码很容易被别人偷看.只要有一个反编译器,任何人都可以分析别人的代码 ...
- 破解Zip加密文件常用的几种方法
前言 在互联网的浪潮中,大家也许碰到过这种情况: 从网络上下载了一个zip文件,最后却发现它是用密码保护的,或者自己用密码加密了一个很重要zip文件,但是一段时间后忘记了密码,无法打开.这个时候,我们 ...
- 你真的了解字典(Dictionary)吗? C# Memory Cache 踩坑记录 .net 泛型 结构化CSS设计思维 WinForm POST上传与后台接收 高效实用的.NET开源项目 .net 笔试面试总结(3) .net 笔试面试总结(2) 依赖注入 C# RSA 加密 C#与Java AES 加密解密
你真的了解字典(Dictionary)吗? 从一道亲身经历的面试题说起 半年前,我参加我现在所在公司的面试,面试官给了一道题,说有一个Y形的链表,知道起始节点,找出交叉节点.为了便于描述,我把上面 ...
- Des加密(js+java结果一致)【原创】
des加密算法,javascript版本和java版本 目录: 1.资源文件下载 2.JavaScript文件(des.js) 3.html文件(des.html) 4.java文件(des.java ...
- 运用加密技术保护Java源代码(转)
出处:运用加密技术保护Java源代码 为什么要加密? 对于传统的C或C++之类的语言来说,要在Web上保护源代码是很容易的,只要不发布它就可以.遗憾的是,Java程序的源代码很容易被别人偷看.只要有一 ...
- web主题公园版权信息破解:script.js加密文件
很多人会使用web主题公园网站的免费worldpress主题,但它的主题又都被加了版权信息,故意让人找不到版权信息的修改位置. 你如果去footer.php里面删除版权信息(技术支持:web主题公园) ...
- 使用 gpg 加密文件 - 通过 shell 或 php
使用 gpg 加密文件 - 通过 shell 或 php 背景:客户提供私钥,并要求我方通过php把加密后的文件传输给他们. 环境 macOS Sierra 10.12.1 php 7.0.8 0.安 ...
随机推荐
- 修改pip源到国内的镜像源
国内网络原因,经常无法访问一些技术网站,pypi.python.org就是其中一个.所以,使用pip给Python安装软件时,经常出现错误.like this: File "/usr/lib ...
- python selenium wait方法
遇到一个网站运行很慢,所以要等待某个元素显示出来之后再进行操作,自己手上的书上没有例子可以直接用 发现一篇文章:http://www.cnblogs.com/yoyoketang/p/6517477. ...
- BZOJ1495 [NOI2006]网络收费 【树形dp + 状压dp】
题目链接 BZOJ1495 题解 观察表格,实际上就是分\(A\)多和\(B\)两种情况,分别对应每个点选\(A\)权值或者\(B\)权值,所以成对的权值可以分到每个点上 所以每个非叶节点实际对应一个 ...
- 洛谷 P4292 [WC2010]重建计划 解题报告
P4292 [WC2010]重建计划 题目描述 \(X\)国遭受了地震的重创, 导致全国的交通近乎瘫痪,重建家园的计划迫在眉睫.\(X\)国由\(N\)个城市组成, 重建小组提出,仅需建立\(N-1\ ...
- go递归打印指定目录下的所有文件及文件夹
func treedir(fpath string){ // 获取fileinfo if finfo,err := os.Stat(fpath); err == nil { // 判断是不是目录 如果 ...
- web中的懒加载
在Web应用程序中,系统的瓶颈常在于系统的响应速度.如果系统响应速度过慢,用户就会出现埋怨情绪,系统的价值也因此会大打折扣.因此,提高系统响应速度,是非常重要的. Web应用程序做的最多就是和后台数据 ...
- HDU1532最大流 Edmonds-Karp,Dinic算法 模板
Drainage Ditches Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...
- 初学SQL语句练习2
-- 子查询 --单行子查询-- 查询出所有比雇员姓名为“CLARK ”工资高的员工的信息 SELECT * FROM EMP WHERE SAL > (SELECT SAL FROM EMP ...
- P2243 电路维修
P2243 电路维修 题目背景 Elf 是来自Gliese 星球的少女,由于偶然的原因漂流到了地球上.在她无依无靠的时候,善良的运输队员Mark 和James 收留了她.Elf 很感谢Mark和Jam ...
- P3866 [TJOI2009]战争游戏
P3866 [TJOI2009]战争游戏 题目背景 小R正在玩一个战争游戏.游戏地图是一个M行N列的矩阵,每个格子可能是障碍物,也可能是空地,在游戏开始时有若干支敌军分散在不同的空地格子中.每支敌军都 ...