通过Runtime.getRuntime()。exec解密文件而不使用Thread.sleep()

时间:2015-09-30 05:56:52

标签: java multithreading encryption

我的代码解密了文件夹中的所有加密文件,但我使用了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)。

非常感谢。

1 个答案:

答案 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守护进程,它没有通过套接字与之通信的已发布的分叉进程)。