Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么myProcess.getInputStream()使用的是java.exe而不是javaw.exe?_Java_Stdout_Javaw - Fatal编程技术网

为什么myProcess.getInputStream()使用的是java.exe而不是javaw.exe?

为什么myProcess.getInputStream()使用的是java.exe而不是javaw.exe?,java,stdout,javaw,Java,Stdout,Javaw,我正在为基于命令行的Factorio游戏无头服务器编写一个包装器。我正在使用ProcessBuilder并获取服务器的标准输出,我正在使用rcon连接(说来话长,标准输入不起作用)与之通信。我几乎完成了它,直到我准备打包jar并在物理服务器上运行它为止。这时我注意到运行jar而不是从IDE(Intelij)运行会阻止服务器的任何输出。我又进行了一些窥探,发现每当我从进程中使用.getInputStream()时,只有在通过控制台(java.exe)启动程序时才会发送服务器的输出,而在没有启动程序

我正在为基于命令行的Factorio游戏无头服务器编写一个包装器。我正在使用ProcessBuilder并获取服务器的标准输出,我正在使用rcon连接(说来话长,标准输入不起作用)与之通信。我几乎完成了它,直到我准备打包jar并在物理服务器上运行它为止。这时我注意到运行jar而不是从IDE(Intelij)运行会阻止服务器的任何输出。我又进行了一些窥探,发现每当我从进程中使用.getInputStream()时,只有在通过控制台(java.exe)启动程序时才会发送服务器的输出,而在没有启动程序(javaw.exe)的情况下根本不会发送

我用cmd.exe测试了.getInputStream(),它在java.exe和javaw.exe中都可以正常工作。我还检查代码是否遵循在IDE之外运行时没有预料到的流程,但它在read.readLine()上阻塞,就好像它在等待输入但没有接收任何内容一样

该过程在此处初始化:

ProcessBuilder pb=new ProcessBuilder(gameExecutablePath,“--start server”,saveLocation+“\\”+saveName,“--server设置”,serverSettingsLocation+“\\”+serverSettingsName,“-c”,serverConfigLocation+“\\”+serverConfigName,“--rcon端口”,“+rcon端口”,“--rcon密码”,“+rconPasskey);
pb.重定向错误流(真);
尝试
{
myProcess=pb.start();
}catch(异常e){e.printStackTrace();}
如果(myProcess==null){stop();}
OutputStream serverInput=myProcess.getOutputStream();
write=新的BufferedWriter(新的OutputStreamWriter(serverInput));
InputStream serverOutput=myProcess.getInputStream();
read=新的BufferedReader(新的InputStreamReader(serverOutput));
之后,输入由gui处理并通过rcon发送(在服务器完全初始化之后),输出被读取并打印到gui的提要JTextArea,如下所示:

while(服务器运行)
{
尝试
{
String line=“”+read.readLine();
如果(行==null)
{
继续;
}
line=line.trim();
if(行包含(“打开广播插座”))
{
serverInitialized=true;
初始化器连接();
}
已同步(serverFeedStringBuilder)
{
printToServerFeed(行);
}
}捕获(异常e){e.printStackTrace();printToServerFeed(e.getMessage());}
}

应用程序应该已经打印出服务器的输出,比如所有关于modload的初始化文本,连接到matchmaking服务器等,就像在IDE中以及使用java.exe时一样。相反,它根本不输出任何内容,但进程继续运行,服务器可以在完成初始化后连接到游戏中。

java.exe很可能被STDIN-OUT上下文阻止,直到进程终止。使用javaw.exe会产生一个新的独立进程,因此会丢失IO环境上下文。很可能是case.Hmmm,这如何解释它与cmd、powershell和其他程序一起工作?java.exe很可能被STDIN-OUT上下文阻止,直到进程终止。使用javaw.exe会产生一个新的独立进程,因此会丢失IO环境上下文。最有可能是case.Hmmm,这如何解释它与cmd、powershell和其他程序一起工作呢?