Java 当试图从子';读取时,程序挂起;s过程标准输出
我等待启动一个进程,将一个整数传递给它,然后得到一个值并打印出来。我(在Windows中)尝试了以下操作:Java 当试图从子';读取时,程序挂起;s过程标准输出,java,process,io,Java,Process,Io,我等待启动一个进程,将一个整数传递给它,然后得到一个值并打印出来。我(在Windows中)尝试了以下操作: mFilename是可执行文件的路径。进程返回1表示正输入,0表示负输入,如果mParam为0,则它将保持在无限循环中。然而,我发现无论我传递给它什么值,retVal总是1。我做错了什么 请原谅我在几分钟前删除了这个问题,我以为问题出在retVal中,但显然这不是该代码中的唯一问题 子进程,用C++编写: #include <iostream> #include <Win
mFilename
是可执行文件的路径。进程返回1表示正输入,0表示负输入,如果mParam
为0,则它将保持在无限循环中。然而,我发现无论我传递给它什么值,retVal
总是1。我做错了什么
请原谅我在几分钟前删除了这个问题,我以为问题出在retVal
中,但显然这不是该代码中的唯一问题
子进程,用C++编写:
#include <iostream>
#include <Windows.h>
bool f(int x)
{
if (x)
return x > 0;
while (1)
Sleep(100);
}
int main()
{
int x;
std::cin>>x;
std::cout<<f(x);
}
但是,不管输入是什么,此修复程序在
char retVal = (char) input.read();
这个解决方案非常简单:
std::cin
只需要一个换行符就可以成功读取整数。结果代码如下所示:
public Boolean call() throws IOException, InterruptedException, ExecutionException, TimeoutException {
Process p = Runtime.getRuntime().exec(mFilename);
final BufferedReader input = new BufferedReader
(new InputStreamReader(p.getInputStream()));
final BufferedWriter output = new BufferedWriter
(new OutputStreamWriter(p.getOutputStream()));
output.write(Integer.toString(mParam));
output.newLine();
output.flush();
ExecutorService executor = Executors.newFixedThreadPool(2);
Callable<Character> readTask = new Callable<Character>() {
@Override
public Character call() throws Exception {
return Character.valueOf((char)input.read());
}
};
Future<Character> future = executor.submit(readTask);
char readVal;
try {
readVal = future.get(3L, TimeUnit.SECONDS);
} finally {
p.destroy();
executor.shutdownNow();
}
return !(readVal == '0');
}
public Boolean call()抛出IOException、InterruptedException、ExecutionException、TimeoutException{
进程p=Runtime.getRuntime().exec(mFilename);
最终BufferedReader输入=新BufferedReader
(新的InputStreamReader(p.getInputStream());
最终BufferedWriter输出=新BufferedWriter
(新的OutputStreamWriter(p.getOutputStream());
output.write(Integer.toString(mParam));
output.newLine();
output.flush();
ExecutorService executor=Executors.newFixedThreadPool(2);
Callable readTask=新的Callable(){
@凌驾
公共字符调用()引发异常{
返回字符.valueOf((char)input.read());
}
};
Future=executor.submit(readTask);
字符读取值;
试一试{
readVal=future.get(3L,时间单位为秒);
}最后{
p、 破坏();
执行者。关机现在();
}
返回!(readVal=='0');
}
注意,我添加了对“无限循环”案例场景的支持。如果我们无法在3秒内从stdout获取输出,我们将抛出异常并终止子进程。我在这里不处理异常,因为函数必须返回一些结果,但在无限循环的情况下,我没有任何结果可返回。如果没有子进程的源代码,很难知道出了什么问题。你是否试过打印出
retVal
,看看它实际上是“1”,而不仅仅是!=”0'
?@BenLawry,是的,它实际上是“1”,至少NetBeans调试器显示了“1”。@prazuber我将把它放到我的IDE中并尝试一下,请忽略我的答案,不确定我是否能够删除我自己的答案。好吧,我也被难倒了。我把你的子进程C++代码复制到.NET 2010中,并构建了一个控制台应用程序…正如我从命令行运行它时所述。复制您的Example.java
,得到与您相同的结果。我尝试了一些不同的方法,当我进行实验时,我要么总是得到1,要么程序永远不会返回(挂起)。如果你弄明白了,请发一个答案。
char retVal = (char) input.read();
public Boolean call() throws IOException, InterruptedException, ExecutionException, TimeoutException {
Process p = Runtime.getRuntime().exec(mFilename);
final BufferedReader input = new BufferedReader
(new InputStreamReader(p.getInputStream()));
final BufferedWriter output = new BufferedWriter
(new OutputStreamWriter(p.getOutputStream()));
output.write(Integer.toString(mParam));
output.newLine();
output.flush();
ExecutorService executor = Executors.newFixedThreadPool(2);
Callable<Character> readTask = new Callable<Character>() {
@Override
public Character call() throws Exception {
return Character.valueOf((char)input.read());
}
};
Future<Character> future = executor.submit(readTask);
char readVal;
try {
readVal = future.get(3L, TimeUnit.SECONDS);
} finally {
p.destroy();
executor.shutdownNow();
}
return !(readVal == '0');
}