我正在尝试使用Java批处理应用程序解压Unix机器上的文件。
源代码:
String fileName = "x98_dms_12";
Runtime.getRuntime().exec("gunzip "+ fileName + ".tar.gz");
System.out.println(" Gunzip:"+"gunzip "+ fileName + ".tar.gz");
Runtime.getRuntime().exec("tar -xvf "+ fileName + ".tar");
System.out.println(" Extract:tar -xvf "+ fileName + ".tar");
当我运行批处理程序时,它不会(完全)工作。只有gunzip命令有效,将我的fileName.tar.gz转换为fileName.tar。但是untar命令似乎没有做任何事情,并且我的日志或Unix控制台中没有错误或异常。
当我在Unix提示符下运行相同的命令时,它们可以正常工作。
请帮忙。
答案 0 :(得分:2)
有几件事:
这是一个可以扩展/适应的工作示例。它使用一个单独的类来处理进程输出流:
class StreamGobbler implements Runnable {
private final Process process;
public StreamGobbler(final Process process) {
super();
this.process = process;
}
@Override
public void run() {
try {
final BufferedReader reader = new BufferedReader(
new InputStreamReader(process.getInputStream()));
String line = null;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
reader.close();
} catch (final Exception e) {
e.printStackTrace();
}
}
}
public void extractTarball(final File workingDir, final String archiveName)
throws Exception {
final String gzFileName = archiveName + ".tar.gz";
final String tarFileName = archiveName + ".tar";
final ProcessBuilder builder = new ProcessBuilder();
builder.redirectErrorStream(true);
builder.directory(workingDir);
builder.command("gunzip", gzFileName);
final Process unzipProcess = builder.start();
new Thread(new StreamGobbler(unzipProcess)).start();
if (unzipProcess.waitFor() == 0) {
System.out.println("Unzip complete, now untarring");
builder.command("tar", "xvf", tarFileName);
final Process untarProcess = builder.start();
new Thread(new StreamGobbler(untarProcess)).start();
System.out.println("Finished untar process. Exit status "
+ untarProcess.waitFor());
}
}
答案 1 :(得分:0)
下面的代码将打印执行的命令的输出。检查它是否返回任何错误。
Process p = Runtime.getRuntime().exec("tar -xvf "+ fileName + ".tar");
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = null;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
答案 2 :(得分:0)
问题是我们提供的命令是UNIX命令,所以它不能在Windows环境中工作。我写了一个脚本文件来克服这个问题,感谢大家的帮助。 Runtime.getRuntime.exec()将花费一些时间来执行给定的命令,因此在每个exec()给thread.wait(3000)完成该过程并转到下一个线程之后。