首先一些代码:
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,而您没有在任何地方运行它们。