Java 尝试读取进程的输出消息时代码卡住
Java Code stucking when attempt read output messages of Process
我使用 ProcessBuilder
在我的启动和停止 Derby Network Server
应用程序中执行 cmd 命令。但是出了点问题,我找不到问题出在哪里。让我解释一下;
正在启动网络服务器;
//Defining path of db files located
File file= new File(FirstTimeMainFrame.class.getProtectionDomain()
.getCodeSource()
.getLocation()
.getPath().replace(new File(FirstTimeMainFrame.class.getProtectionDomain().getCodeSource().getLocation().getPath()).getName(), "").replace("%20", " "));
String path = file+"\DB";
//Process Creating
ProcessBuilder builder = new ProcessBuilder();
Process process = null;
String[] command = new String[3];
command[0] = "cmd.exe";
command[1] = "/c"; //This things say to CMD close when commands complete.
command[2] = "cd "+path+" && java -jar derbyrun.jar server start";
builder = new ProcessBuilder(command[0], command[1], command[2]);
builder.redirectErrorStream(true);
process = builder.start();
//Reading CMD outputs
BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
while (true) {
line = br.readLine();
if (line == null) { break; }
System.out.println(line);
}
当我调试项目时,我看到两行输出,当 While
循环第三次检查时,调试卡在 line = br.readLine();
。整个程序卡住,无法继续。
输出;
Fri Dec 25 20:54:36 EET 2015 : Security manager installed using the Basic server security policy.
Fri Dec 25 20:54:36 EET 2015 : Apache Derby Network Server - 10.12.1.1 - (1704137) started and ready to accept connections on port 1527
重要 P.S.: 如果我删除 //Reading CMD outputs codes
一切正常。服务器启动、数据库创建、表创建等
我也直接在 Windows 下尝试了相同的 CMD 命令。当我执行命令时,写了两行命令提示符 window 停留在闪烁的光标处(我认为没有关闭或完成)但是 Derby Server 以编程方式或直接在 Windows.[= 中启动没有问题18=]
场景中实际上有两个 运行ning 进程:从 java 代码启动的 CMD 进程和由 CMD 生成的 Derby 服务器进程。
Derby 服务器进程的输出被定向到命令行,然后可以在 java 代码中读取。服务器进程可以 运行 无限长直到它被终止,这就是输出流永远不会结束的原因。
挂起 java 代码是因为此时流中没有可用字节 - 服务器进程告诉您它已成功初始化,然后进入等待状态。
我使用 ProcessBuilder
在我的启动和停止 Derby Network Server
应用程序中执行 cmd 命令。但是出了点问题,我找不到问题出在哪里。让我解释一下;
正在启动网络服务器;
//Defining path of db files located
File file= new File(FirstTimeMainFrame.class.getProtectionDomain()
.getCodeSource()
.getLocation()
.getPath().replace(new File(FirstTimeMainFrame.class.getProtectionDomain().getCodeSource().getLocation().getPath()).getName(), "").replace("%20", " "));
String path = file+"\DB";
//Process Creating
ProcessBuilder builder = new ProcessBuilder();
Process process = null;
String[] command = new String[3];
command[0] = "cmd.exe";
command[1] = "/c"; //This things say to CMD close when commands complete.
command[2] = "cd "+path+" && java -jar derbyrun.jar server start";
builder = new ProcessBuilder(command[0], command[1], command[2]);
builder.redirectErrorStream(true);
process = builder.start();
//Reading CMD outputs
BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
while (true) {
line = br.readLine();
if (line == null) { break; }
System.out.println(line);
}
当我调试项目时,我看到两行输出,当 While
循环第三次检查时,调试卡在 line = br.readLine();
。整个程序卡住,无法继续。
输出;
Fri Dec 25 20:54:36 EET 2015 : Security manager installed using the Basic server security policy.
Fri Dec 25 20:54:36 EET 2015 : Apache Derby Network Server - 10.12.1.1 - (1704137) started and ready to accept connections on port 1527
重要 P.S.: 如果我删除 //Reading CMD outputs codes
一切正常。服务器启动、数据库创建、表创建等
我也直接在 Windows 下尝试了相同的 CMD 命令。当我执行命令时,写了两行命令提示符 window 停留在闪烁的光标处(我认为没有关闭或完成)但是 Derby Server 以编程方式或直接在 Windows.[= 中启动没有问题18=]
场景中实际上有两个 运行ning 进程:从 java 代码启动的 CMD 进程和由 CMD 生成的 Derby 服务器进程。
Derby 服务器进程的输出被定向到命令行,然后可以在 java 代码中读取。服务器进程可以 运行 无限长直到它被终止,这就是输出流永远不会结束的原因。
挂起 java 代码是因为此时流中没有可用字节 - 服务器进程告诉您它已成功初始化,然后进入等待状态。