需求:用户上传了一个大文件压缩包,压缩包是加密的,需要在后台进行解密操作,文件大小(1G)左右,解密过程需要1分钟。。。需要提速
ok,直接用java多线程的方式来解决吧,先读取文件,然后将io流切分,每段io开启一个线程进行解密,最后按顺序将解密后的io片段进行合并
闲话不说,直接上代码,不需要导入其他jar包
首先是工具
ioutil,就是关闭流而已
package com.noryar.filesystem.util;
import java.io.Closeable;
import java.io.IOException;
/**
* IOUtil.
* @author Leon Lee.
*/
public class IOUtil {
/**
* close IO resource.
* @param closeables :IO resource, implements Closable
* @throws IOException :Exception
*/
public static void close(Closeable... closeables) throws IOException {
if (closeables != null) {
for (Closeable closeable : closeables) {
if (closeable != null) {
closeable.close();
}
}
}
}
/**
* close IO resource. do not throw Exception.
* @param closeables : IO resource, implements Closable
*/
public static void closeQuietly(Closeable... closeables) {
try {
close(closeables);
} catch (IOException e) {
// do nothing
}
}
}
package com.noryar.filesystem.util;
import java.io.ByteArrayOutputStream;
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.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.CipherInputStream;
import javax.crypto.CipherOutputStream;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
/**
* SecurityFileUtil.
* @author Leon Lee.
*/
public class SecurityUtil {
/**
* init AES Cipher.
* @param keySource keySource
* @param cipherMode keyMode
* @return Cipher
*/
private static Cipher initAESCipher(final String keySource, final int cipherMode) {
KeyGenerator keyGenerator = null;
Cipher cipher = null;
try {
keyGenerator = KeyGenerator.getInstance("AES");
// init 128 key with import random source[key]
keyGenerator.init(128, new SecureRandom(keySource.getBytes()));
// create key
SecretKey secretKey = keyGenerator.generateKey();
// get key of byte[]
byte[] codeFormat = secretKey.getEncoded();
SecretKeySpec key = new SecretKeySpec(codeFormat, "AES");