gpt4 book ai didi

尝试读取 Process 的输出消息时 Java 代码卡住

转载 作者:行者123 更新时间:2023-11-30 07:42:28 26 4
gpt4 key购买 nike

我使用 ProcessBuilder 在我的应用程序中执行 cmd 命令来启动和停止 Derby Network Server。但出了问题,我找不到问题出在哪里。让我解释一下;

启动网络服务器;

//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

重要的附注:如果我删除 //Reading CMDoutputscodes 所有事情都会完美运行。服务器启动、数据库创建、表创建等

我还直接在 Windows 下尝试了相同的 CMD 命令。当我执行命令时,写入了两行,命令提示符窗口卡在闪烁的光标处(我认为未关闭或完成),但 Derby Server 以编程方式或直接在 Windows 中启动没有问题。

最佳答案

该场景中实际上运行着两个进程:从 java 代码启动的 CMD 进程和由 CMD 生成的 Derby 服务器进程。

Derby 服务器进程的输出被定向到命令行,然后可以用 java 代码读取。服务器进程可以无限运行直到终止,这就是输出流永远不会结束的原因。

在 Java 代码中发生挂起是因为此时流中没有可用字节 - 服务器进程告诉您它已成功初始化,然后进入等待状态。

关于尝试读取 Process 的输出消息时 Java 代码卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34465574/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com