使用Java AES对大型音频/视频/html文件进行加密解密时内存泄漏

使用Java AES对大型音频/视频/html文件进行加密解密时内存泄漏,java,encryption,aes,Java,Encryption,Aes,我得到一个任务来执行加密和解密一些大量的文件,这些文件包括音频、视频和一些html、swf文件。为此,我使用的代码在我的系统中运行良好。但当我试图使用JavaRMI在服务器上执行相同的代码时,它抛出java.lang.OutOfMemoryErrorjava堆空间 请就如何解决此内存泄漏问题提出您的看法 以下是我正在使用的代码: public static void performEncryption(String baseFolderLocation) { String

我得到一个任务来执行加密和解密一些大量的文件,这些文件包括音频、视频和一些html、swf文件。为此,我使用的代码在我的系统中运行良好。但当我试图使用JavaRMI在服务器上执行相同的代码时,它抛出
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相同。