Java,用我的自定义密码编码
我有一个程序,可以用我的自定义密码、文本文件和无损媒体文件进行编码和解码,但问题是超过2MB的数据会崩溃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
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
。您需要做出响应
aStringBuilder
,而不是字符串
。