我的代码解密了文件夹中的所有加密文件,但我使用了Thread.sleep()。如果我不使用Thread.sleep();程序无法解密所有文件。我正在寻找更好的方法来解密没有Thread.sleep();
的所有文件我需要在代码中编写条件,此代码等待文件解密。你能帮帮我吗?
我的代码:
public static void decrypt() throws InterruptedException, IOException {
File folder = new File("c:/Users/hajdukri/Desktop/src");
File[] files = folder.listFiles();
String pass;
Scanner in = new Scanner(System.in);
System.out.println("Enter a password");
pass = in.nextLine();
if("pass123456".equals(pass)){
for(File a :files){
Thread.sleep(500);
Runtime.getRuntime().exec("cmd /C start C:\\Users\\hajdukri\\Documents\\NetBeansProjects\\JavaApplication3\\gpg.bat");
if (a.isFile()) {
String fileName = a.getName();
// get only only last index (exeption)
int co = fileName.lastIndexOf('.')+1;
StringBuilder sb = new StringBuilder(fileName);
sb.delete(0, co);
sb.toString();
if ("gpg".equals(sb.toString())){
int last = fileName.lastIndexOf('.');
StringBuilder delLast = new StringBuilder(fileName);
delLast.delete(last, 4+last);
delLast.toString();
File file = new File("C:\\Users\\hajdukri\\Documents\\NetBeansProjects\\JavaApplication3\\gpg.bat");
String content = "cd C:\\Users\\hajdukri\\Desktop\\src \r\ngpg --output "+ delLast +" --batch --passphrase "+"\""+pass+"\""+ " "+" --decrypt "+ fileName +"\r\nexit b/";
FileWriter fw = new FileWriter(file.getAbsoluteFile());
try (BufferedWriter bw = new BufferedWriter(fw)) {
bw.write(content);
bw.close();
}
}
}
}
}
else{
System.out.println("Invalid password entered!");}
}
我只需要在上一个文件被去除文件时为下一个文件运行Runtime.getRuntime()。exec(gpg.bat)。
非常感谢。
答案 0 :(得分:0)
Runtime.exec()返回一个Process对象。
您必须读取输出和错误流。如果不这样做,小的OS缓冲区将填满,进程(cmd.exe)将一直挂起,直到你这样做。
由于两个流都是阻塞的,因此您需要至少2个线程(当前线程读取进程输出时,错误流通常为1个线程)。对于可靠控制,我通常在流上放置2个线程,而当前线程等待进程,超时,并在需要时终止它。
如果您没有任何输出,您可能会在不读取错误/输出流的情况下离开,但您不会看到问题。但是你仍然必须使用 Process.waitFor(),除非你打算同时运行一个有限的数字。
此外,子进程正在使用一些系统描述符。所以你不能不顾及地产生数千人......
其他考虑因素:当JVM堆真的很高时,HotSpot Runtime.exec在产生子进程时非常糟糕。假设你有一个10 GB的jvm,产生一个子exec fork将需要10GB的虚拟内存。所以,在这样的环境中,做超过1个exec变得非常棘手。 (我不得不使用一个微小的exec守护进程,它没有通过套接字与之通信的已发布的分叉进程)。