首先一些代码:

    Runtime runtime = Runtime.getRuntime();
    String args[] = new String[2];
//  args[0] = "/bin/bash";
//  args[1] = "-c";
//  args[2] = "/usr/bin/rpm2cpio "+archiveFile.getCanonicalPath()+" | /bin/cpio -idmv";
    args[0] = "/usr/bin/rpm2cpio";
    args[1] = archiveFile.getCanonicalPath();
    Process rpm2cpioProcess = runtime.exec(args, null, dir);
//  System.out.println("started rpm2cpio");

    String args2[] = new String[3];
    args2[0] = "/bin/cpio";
    args2[1] = "-idmu";
    args2[2] = "--quiet";
    Process cpioProcess = runtime.exec(args2, null, dir);
//  System.out.println("started cpio");

    InputStream fromRpm2cpio = rpm2cpioProcess.getInputStream();
    new ProcessInputStreamer(rpm2cpioProcess.getErrorStream());
    OutputStream fromCpio = cpioProcess.getOutputStream();
    new PipedStreamer(fromRpm2cpio, fromCpio);
    new ProcessInputStreamer(cpioProcess.getErrorStream());
//  System.out.println("pipe created");
    while(cpioProcess!=null && fromRpm2cpio!=null) {
        boolean doSleep = true;
//      System.out.println("waking up");
        if (cpioProcess!=null) {
            try {
                if (cpioProcess.exitValue()==0) {
                    cpioProcess = null;
                    doSleep = false;
                }
            } catch(IllegalThreadStateException e) {
            }
        }
        if (rpm2cpioProcess!=null) {
            try {
                if (rpm2cpioProcess.exitValue()==0) {
                    rpm2cpioProcess = null;
                    doSleep = false;
                }
            } catch(IllegalThreadStateException e) {
            }
        }
        if (doSleep) {
            Thread.sleep(30);
        }
//      System.out.println("still running");
    }


我正在尝试提取rpm存档的内容。多次修改后,此代码可以正常工作。我的第一次尝试是通过Java执行下一个代码:

/bin/bash -c '/usr/bin/rpm2cpio <archive-file> | /bin/cpio -idmv'


第一次运行它时效果很好(您可以在上面注释的代码中看到它)。我第二次运行该代码,因为提取的文件已经存在,它被阻止了。因此,我认为可能与管道有关,因此将调用分为两个单独的进程。这也没有太大帮助。因此,我然后将/ bin / cpio的参数从'-idmv'修改为'-idmu --quiet',现在它可以工作了。不幸的是,-u选项“无条件”地覆盖了现有文件,这并不是真正需要的。我的问题是为什么它用-idmv阻止,为什么不用-idmu阻止?

最佳答案

我猜想您的ProcessInputStreamer和/或PipedStreamer实现了Runnable或extent Thread,而您没有在任何地方运行它们。

07-27 21:52