Java,用我的自定义密码编码

Java,用我的自定义密码编码,java,encryption,memory-management,Java,Encryption,Memory Management,我有一个程序,可以用我的自定义密码、文本文件和无损媒体文件进行编码和解码,但问题是超过2MB的数据会崩溃 void doTheRabi(File f, byte[] hashedPass) { try { // BufferedReader br = new BufferedReader(new InputStreamReader(new // FileInputStream(f))); // legge il file // String

我有一个程序,可以用我的自定义密码、文本文件和无损媒体文件进行编码和解码,但问题是超过2MB的数据会崩溃

void doTheRabi(File f, byte[] hashedPass) {
    try {
        // BufferedReader br = new BufferedReader(new InputStreamReader(new
        // FileInputStream(f))); // legge il file
        // String response = new
        // String(Files.readAllBytes(Paths.get(f.getAbsolutePath()))); // scrive tutto
        // il file in memoria
        FileReader fr = new FileReader(f);
        BufferedReader br = new BufferedReader(fr);
        String response = new String(); // ASSEGNO IL CONTENUTO DEL FILE IN QUESTA STRINGA
        for (String line; (line = br.readLine()) != null; response += line + "\n")
            ;
        response = response.replace("\n", "newline").replace("\r", "newrow"); // rimpiazzo le new line con "newline"
                                                                                // e "newrow"
        byte[] encodedfile = response.getBytes(StandardCharsets.UTF_8); // trasformo il file in byte
        byte[] result = new byte[encodedfile.length]; // variabile temporanea
        int hpc = 0;
        for (int i = 0; i < result.length; i++) {
            result[i] = (byte) (encodedfile[i] + hashedPass[hpc++]); // algoritmo rabi
            if (hpc == hashedPass.length) {
                hpc = 0;
            }
        }
        String encodedresult = Base64.getEncoder().encodeToString(result); // restituisco il risultato in base64
        FileWriter fw = new FileWriter(f);
        PrintWriter pw = new PrintWriter(fw);
        pw.print("");
        pw.append(encodedresult /* + "extension=" + extString */); // scrivo nel file tutto il risultato
        pw.flush();
        pw.close();
        fw.close();
        br.close();
        String path = f.getAbsolutePath();
        String newName = path + ".rab1";
        f.renameTo(new File(newName));
    } catch (Exception e) {
        console.appendText("Error: " + e.getMessage() + "\n");
        e.printStackTrace();
    }
}

// operazione inversa
void killTheRabi(File f, byte[] hashedPass) {
    try {
        BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(f)));
        String response = new String();
        for (String line; (line = br.readLine()) != null; response += line)
            ;
        byte[] decodedfile = Base64.getDecoder().decode(response);
        byte[] result = new byte[decodedfile.length];
        int hpc = 0;
        for (int i = 0; i < result.length; i++) {
            result[i] = (byte) (decodedfile[i] - hashedPass[hpc++]);
            if (hpc == hashedPass.length) {
                hpc = 0;
            }
        }
        String resultString = bytesToString(result);
        String finalres = resultString.replace("newline", "\n").replace("newrow", "\r");
        FileWriter fw = new FileWriter(f);
        PrintWriter pw = new PrintWriter(fw);
        pw.print("");
        pw.append(finalres);
        pw.flush();
        pw.close();
        fw.close();
        br.close();
        String path = f.getAbsolutePath();
        String newName = path.replace(".rab1", "");
        f.renameTo(new File(newName));
    } catch (Exception e) {
        console.appendText("Error: " + e.getMessage() + "\n");
        e.printStackTrace();
    }
}
void doTheRabi(文件f,字节[]hashedPass){
试一试{
//BufferedReader br=新的BufferedReader(新的InputStreamReader(新的
//FileInputStream(f));//legge-il文件
//字符串响应=新
//字符串(Files.readAllBytes(path.get(f.getAbsolutePath()));//scrive tutto
//记忆中的il文件
FileReader fr=新的FileReader(f);
BufferedReader br=新的BufferedReader(fr);
String response=new String();//在QUESTA STRINGA中的ASSEGNO IL contentuto DEL文件
for(字符串行;(line=br.readLine())!=null;response+=line+“\n”)
;
response=response.replace(“\n”,“newline”).replace(“\r”,“newrow”);//rimpiazzo le newline con“newline”
//e“纽罗”
byte[]encodedfile=response.getBytes(StandardCharsets.UTF_8);//以字节表示的trasformo il文件
byte[]result=新字节[encodedfile.length];//变量临时变量
int-hpc=0;
for(int i=0;i

我做错了什么?我认为这是因为内存已满,因为java使用虚拟机,但我不知道如何提高内存使用率,可能是使用了缓冲区,但我还没有使用它们吗?

由于您可能在内存中保存了大量数据,请尝试以下方法:
通过从参数-Xmx2048m或更多开始增加JVM要使用的最大堆大小

您会收到什么错误消息?它只是冻结了不一定是错误的堆大小。很可能你的代码还在处理你的数据,这是另一回事。不要把所有的东西都保存在内存中,你可以一块接一块地工作。而且您组装字符串
响应
的方法效率极低。了解如何使用
StringBuilder
。您需要做出
响应
a
StringBuilder
,而不是
字符串