使用Java AES对大型音频/视频/html文件进行加密解密时内存泄漏
我得到一个任务来执行加密和解密一些大量的文件,这些文件包括音频、视频和一些html、swf文件。为此,我使用的代码在我的系统中运行良好。但当我试图使用JavaRMI在服务器上执行相同的代码时,它抛出使用Java AES对大型音频/视频/html文件进行加密解密时内存泄漏,java,encryption,aes,Java,Encryption,Aes,我得到一个任务来执行加密和解密一些大量的文件,这些文件包括音频、视频和一些html、swf文件。为此,我使用的代码在我的系统中运行良好。但当我试图使用JavaRMI在服务器上执行相同的代码时,它抛出java.lang.OutOfMemoryErrorjava堆空间 请就如何解决此内存泄漏问题提出您的看法 以下是我正在使用的代码: public static void performEncryption(String baseFolderLocation) { String
java.lang.OutOfMemoryError
java堆空间
请就如何解决此内存泄漏问题提出您的看法
以下是我正在使用的代码:
public static void performEncryption(String baseFolderLocation)
{
String key = "This is a secret";
System.out.println("Started Doing Encrypting...");
List<File> filenames = getAllfilesInFolder(baseFolderLocation, new ArrayList<File>());
int processedFilesCount = 0;
for (File file : filenames) {
try {
Crypto.fileProcessor(Cipher.ENCRYPT_MODE, key, file.getAbsoluteFile(), file.getAbsoluteFile());
} catch (Exception ex) {
// ex.printStackTrace();
}
processedFilesCount++;
}
System.out.println("Ended Encrypting...");
}
static void fileProcessor(int cipherMode, String key, File inputFile, File outputFile) {
try {
Key secretKey = new SecretKeySpec(key.getBytes(), "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(cipherMode, secretKey);
FileInputStream inputStream = new FileInputStream(inputFile);
byte[] inputBytes = new byte[(int) inputFile.length()];
inputStream.read(inputBytes);
byte[] outputBytes = cipher.doFinal(inputBytes);
FileOutputStream outputStream = new FileOutputStream(outputFile);
outputStream.write(outputBytes);
inputStream.close();
outputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static List<File> getAllfilesInFolder(String directoryName, ArrayList<File> files) {
File directory = new File(directoryName);
// get all the files from a directory
File[] fList = directory.listFiles();
for (File file : fList)
{
if (file.isFile())
{
files.add(file);
}
else if (file.isDirectory())
{
getAllfilesInFolder(file.getAbsolutePath(), files);
}
}
return files;
}
publicstaticvoid性能选项(stringbasefolderlocation)
{
String key=“这是一个秘密”;
System.out.println(“开始加密…”);
列表文件名=GetAllFileInfolder(baseFolderLocation,new ArrayList());
int processedfilescont=0;
用于(文件名:文件名){
试一试{
文件处理器(Cipher.ENCRYPT_模式,密钥,file.getAbsoluteFile(),file.getAbsoluteFile());
}捕获(例外情况除外){
//例如printStackTrace();
}
processedFilesCount++;
}
System.out.println(“结束加密…”);
}
静态void文件处理器(int-cipherMode、字符串键、文件输入文件、文件输出文件){
试一试{
Key secretKey=newsecretkeyspec(Key.getBytes(),“AES”);
Cipher Cipher=Cipher.getInstance(“AES”);
cipher.init(cipherMode,secretKey);
FileInputStream inputStream=新的FileInputStream(inputFile);
byte[]inputBytes=新字节[(int)inputFile.length()];
inputStream.read(inputBytes);
byte[]outputBytes=cipher.doFinal(inputBytes);
FileOutputStream outputStream=新的FileOutputStream(outputFile);
outputStream.write(outputBytes);
inputStream.close();
outputStream.close();
}捕获(例外e){
e、 printStackTrace();
}
}
公共静态列表GetAllFileInfolder(字符串目录名、ArrayList文件){
文件目录=新文件(目录名);
//从目录中获取所有文件
File[]fList=directory.listFiles();
for(文件:fList)
{
if(file.isFile())
{
文件。添加(文件);
}
else if(file.isDirectory())
{
GetAllFileInfolder(file.getAbsolutePath(),files);
}
}
归还文件;
}
您可以尝试使用-Xmx选项增加服务器的java堆内存吗?您加密的文件有多大?存储大于~2.147 GB的文件将产生此错误。您的输入和输出文件似乎相等…Crypto.fileProcessor(Cipher.ENCRYPT_模式,密钥,file.getAbsoluteFile(),file.getAbsoluteFile());不要一次读取整个文件,使用CipherOutputStream
并将其传输到InputStream
。文件大小大约在200-300 MB@lukepark内,这已经通过增加堆内存完成,但结果与@Rahul B相同。