在使用ProcessBuilder的Java应用程序中,我无法读取在git bash中运行的git命令的输出。
OS:Windows 8.1---IDE:IntelliJ
cd C:/Users/Utente/Documents/Repository-SVN-Git/Bookkeeper && git ls-files | grep .java | wc -l
Result in git-bash :
2140
Result in IntelliJ :
--- Command run successfully
--- Output=
public class SelectMetrics {
public static final String path_bash = "C:/Program Files/Git/git-bash.exe";
public static final String path_repository = "cd C:/Users/Utente/Documents/Bookkeeper";
public static final String git_command = "git ls-files | grep .java | wc -l";
public static final String command_pipe = path_repository + " && " + git_command;
public static void main(String[] args) {
runCommandPIPE(command_pipe);
}
public static void runCommandPIPE(String command) {
try {
ProcessBuilder processBuilder = new ProcessBuilder();
processBuilder.command(path_bash, "-c", command);
Process process = processBuilder.start();
StringBuilder output = new StringBuilder();
BufferedReader reader = new BufferedReader(
new InputStreamReader(process.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
output.append(line + "\n");
}
int exitVal = process.waitFor();
if (exitVal == 0) {
System.out.println(" --- Command run successfully");
System.out.println(" --- Output=" + output);
} else {
System.out.println(" --- Command run unsuccessfully");
}
} catch (IOException | InterruptedException e) {
System.out.println(" --- Interruption in RunCommand: " + e);
// Restore interrupted state
Thread.currentThread().interrupt();
}
}
}
使用processBuilder打开git bash并在其中执行命令
但是,我仍然不明白为什么不能用ProcessBuilder读取输出
问题应该在使用
C:/Program Files/Git/git-bash.exe
因为它打开了用户用于工作的窗口,但在java应用程序的运行时,您应该使用
C:/Program Files/Git/bin/bash.exe
这样,ProcessBuilder就可以读取git操作的结果。
ProcessBuilder无法从git-bash.exe窗口读取,正确的做法是读取的结果为NULL。如果在运行时在git-bash.exe中运行命令,结果将只显示在窗口git-bash.exe中,java应用程序无法读取它。
public static final String path_bash = "C:/Program Files/Git/bin/bash.exe";
然后
Result in git-bash :
2183
Result in IntelliJ :
--- Command run successfully
--- Output=2183
我想用java代码调用一个外部程序,然后Google告诉我Runtime或ProcessBuilder可以帮助我完成这项工作。我试过了,结果发现java程序无法退出,这意味着子进程和父进程都将永远等待。它们要么挂起,要么陷入僵局。 有人告诉我原因是子进程的缓存太小了。当它试图将数据返回给父进程时,但是父进程没有及时读取它,然后他们两个都挂起了。所以他们建议我叉一个线程来负责读取子进程的缓存数据。我
我想在提取一些数据时使用外部工具(循环通过行)。为此,我首先使用了Runtime.getRuntime()。exec()执行它。但后来我的提取变得很慢。所以我在寻找一种可能性,在循环的每个实例中,使用shell的同一个实例来执行外部工具。 我发现,我应该使用ProcessBuilder。但是现在还不行。 这是我测试执行的代码(已经从论坛中的答案输入): 我想在另一个类中调用它,例如 Testcla
问题内容: 我正在Ubuntu 11.4上的一个终端上运行它。 假设我执行一个bash脚本,输出为: 在同一个bash脚本中,如何将上述输出存储为一个或多个变量? 理想的解决方案是准备好在以下条件中使用:(输出的第一行将存储在等中) 问题答案: 所以你要 请参见Bash手册中的“此处字符串” 。 或流程替代
问题内容: 我有一个Java应用程序,该应用程序存在一些性能问题,有人建议我以verbose:gc模式运行它。这已经完成,但是我不知道如何解释日志记录。是否可以向我解释这一切的含义,或者为我提供提高性能的建议? 可以在以下位置找到输出日志:http : //pastebin.com/uDNPEGcd 在此先感谢您,马尔滕 问题答案: 在每个gc集合之后立即打印,并打印有关每个世代内存详细信息的详细
问题内容: 我正在尝试使用以下代码重定向在ProcessBuilder的帮助下启动的流程的输出 但是它以失败告终 线程“主”中的异常java.io.IOException:无法运行程序“ / myScript >> / myLogFile 2>&1 <&-&”:java.io.IOException:error = 2,java.lang中没有此类文件或目录.ProcessBuilder.star