【发布时间】:2017-08-16 16:31:10
【问题描述】:
我正在为 CLI 程序制作 GUI,当激活此事件时,jLabel4 文本立即更改为 Task: Finished Exporting。
为什么.exec(...); 命令不起作用?这不是命令语法,我尝试用touch new.file 替换我的命令,但这也不起作用。
在我看来,它似乎不会尝试执行命令。
Java 代码:
private void jMenuItem2ActionPerformed(java.awt.event.ActionEvent evt) {
if (ext[1].equals("iso") || ext[1].equals("wbfs")) {
String tmpPath = "";
if (jtPath.indexOf(".") > 0)
tmpPath = jtPath.substring(0, jtPath.lastIndexOf("."));
Process p;
try {
p = Runtime.getRuntime().exec("wit extract \"" + jtPath + "\" \"" + tmpPath + "\"");
p.waitFor();
jLabel4.setText("Task: Exporting...");
p.destroy();
} catch (IOException ex) {
Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex);
} catch (InterruptedException ex) {
Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex);
}
System.out.println("wit extract \"" + jtPath + "\" \"" + tmpPath + "\"");
jLabel4.setText("Task: Finished Exporting");
} else {
JOptionPane.showMessageDialog(null, "You can only extract .iso and .wbfs file formats.");
}
}
命令行输出:
wit extract "/home/adam/Wii Hacking/NSMBW SMNE01.wbfs" "/home/adam/Wii Hacking/NSMBW SMNE01"
【问题讨论】:
-
一方面,您根本没有处理进程的流,有可能会耗尽缓冲区空间并且无法识别命令行错误消息。另一方面,您的代码违反了 Swing 线程规则。
-
另外,您需要捕获并评估从
p.waitFor();返回的 int。 -
@HovercraftFullOfEels 退出值为27,不知道是什么意思。
-
它应该以 0 退出。检查 wit 文档以了解该值的含义。并处理 InputStream 和 ErrorStream 进程以查看是否返回任何有用的信息并防止缓冲区内存不足。
-
@HovercraftFullOfEels 错误 27 是“无法打开文件”但是当我从终端而不是 java 执行相同的命令时,它工作正常。
标签: java linux user-interface command-line