对应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改进版的更多相关文章

  1. java基础IO流 复制键盘录入的目录,复制其中的.java文件到指定目录,指定目录中有重名,则改名 对加密文件计算字母个数

    package com.swift.jinji; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; im ...

  2. (iOS)Base64加密和DES加密、以及JAVA和iOS中DES加密统一性问题

    我们在项目中为了安全方面的考虑,通常情况下会选择一种加密方式对需要安全性的文本进行加密,而Base64加密和DES64加密是常用的加密算法.我记得我在前一个项目中使用的就是这两种加密算法的结合:Bas ...

  3. 运用加密技术保护Java源代码/定制ClassLoader

    为什么要加密? 对于传统的C或C++之类的语言来说,要在Web上保护源代码是很容易的,只要不发布它就可以.遗憾的是,Java程序的源代码很容易被别人偷看.只要有一个反编译器,任何人都可以分析别人的代码 ...

  4. 破解Zip加密文件常用的几种方法

    前言 在互联网的浪潮中,大家也许碰到过这种情况: 从网络上下载了一个zip文件,最后却发现它是用密码保护的,或者自己用密码加密了一个很重要zip文件,但是一段时间后忘记了密码,无法打开.这个时候,我们 ...

  5. 你真的了解字典(Dictionary)吗? C# Memory Cache 踩坑记录 .net 泛型 结构化CSS设计思维 WinForm POST上传与后台接收 高效实用的.NET开源项目 .net 笔试面试总结(3) .net 笔试面试总结(2) 依赖注入 C# RSA 加密 C#与Java AES 加密解密

    你真的了解字典(Dictionary)吗?   从一道亲身经历的面试题说起 半年前,我参加我现在所在公司的面试,面试官给了一道题,说有一个Y形的链表,知道起始节点,找出交叉节点.为了便于描述,我把上面 ...

  6. Des加密(js+java结果一致)【原创】

    des加密算法,javascript版本和java版本 目录: 1.资源文件下载 2.JavaScript文件(des.js) 3.html文件(des.html) 4.java文件(des.java ...

  7. 运用加密技术保护Java源代码(转)

    出处:运用加密技术保护Java源代码 为什么要加密? 对于传统的C或C++之类的语言来说,要在Web上保护源代码是很容易的,只要不发布它就可以.遗憾的是,Java程序的源代码很容易被别人偷看.只要有一 ...

  8. web主题公园版权信息破解:script.js加密文件

    很多人会使用web主题公园网站的免费worldpress主题,但它的主题又都被加了版权信息,故意让人找不到版权信息的修改位置. 你如果去footer.php里面删除版权信息(技术支持:web主题公园) ...

  9. 使用 gpg 加密文件 - 通过 shell 或 php

    使用 gpg 加密文件 - 通过 shell 或 php 背景:客户提供私钥,并要求我方通过php把加密后的文件传输给他们. 环境 macOS Sierra 10.12.1 php 7.0.8 0.安 ...

随机推荐

  1. HDU1565_方格取数(1)

    给一个数字方阵,你要从中间取出一些数字,保证相邻的两个数字不同时被取出来,求取出来的最大的和是多少? 建立图模型,对于行列的和为奇数的格子,建立一条从原点到达这个点的边,对于行列和为偶数的格子,建立一 ...

  2. CodeForces - 988C(STL大法好)

    请你找出两个编号不同的数列,并从这两个数列中各恰好删除一个数,使得这两个数列的和相等. 用vector存每一个数 用map标记 即可 #include <bits/stdc++.h> us ...

  3. [BZOJ4820]硬币游戏 KMP+高斯消元

    4820: [Sdoi2017]硬币游戏 Time Limit: 10 Sec  Memory Limit: 128 MB Description 周末同学们非常无聊,有人提议,咱们扔硬币玩吧,谁扔的 ...

  4. PHP 性能分析第一篇: Intro to Xhprof & Xhgui

    [前言]这是国外知名博主 Davey Shafik所撰写的 PHP 应用性能分析系列的第一篇,阅读第二篇可深入了解 xhgui,第三篇则关注于性能调优实践. 原文链接如下: https://blog. ...

  5. 解题:BZOJ 4644 经典砂比题(雾

    题面 初见线段树分治 (对我来说可不是什么经典题=.=) 把时间轴建出来一棵线段树,然后在对应的区间上打标记,最后把整棵树DFS一遍,到叶节点输出答案即可 (把最终答案开成全局的了调了半天 #incl ...

  6. bzoj2564集合的面积

    题目描述 对于一个平面上点的集合P={(xi,yi )},定义集合P的面积F(P)为点集P的凸包的面积. 对于两个点集A和B,定义集合的和为: A+B={(xiA+xjB,yiA+yjB ):(xiA ...

  7. BZOJ 3160 FFT+马拉车

    题意显然 ans=回文子序列数目 - 回文子串数目 回文子串直接用马拉车跑出来 回文子序列一开始总是不知道怎么求 (太蠢了) 后面看了题解 构造一个神奇的卷积 (这个是我盗的图)地址 后面还有一些细节 ...

  8. css基础--常用css属性01

    1  背景相关 背景颜色 background-color     = 颜色名称/rgb值/十六进制值 背景图片 background-image = url('') 背景图片平铺方式 backgro ...

  9. 装饰器 and 闭包函数 未完。。。。。

    装饰器是一个返回函数的高阶函数.装饰器=高阶函数+函数嵌套+闭包 装饰器需要遵循的原则:不修改被装饰函数的源代码,不修改被装饰函数的调用方式. 高阶函数 1.函数接收的参数是一个函数名 2.函数的返回 ...

  10. P1993 小K的农场 && 差分约束

    首先第一篇讨论的是差分约束系统解的存在 差分约束系统是有 \(n\) 个变量及 \(m\) 个(如 \(x_{i} - x_{j} \leq a_{k}\) )关系组成的系统 差分约束解的求解可以转化 ...