通过向stdout写入参数和从stdin读取参数,从Java调用exe
我看过这个问题: 这个答案很好 但我还想将参数传递给外部进程的stdin,并从这个进程的stdout读取 我该怎么做 我的努力:通过向stdout写入参数和从stdin读取参数,从Java调用exe,java,exe,stdout,stdin,processbuilder,Java,Exe,Stdout,Stdin,Processbuilder,我看过这个问题: 这个答案很好 但我还想将参数传递给外部进程的stdin,并从这个进程的stdout读取 我该怎么做 我的努力: package call_external; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; /** * Created by redwhite on 27.03.2017. */ public class Externa
package call_external;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**
* Created by redwhite on 27.03.2017.
*/
public class ExternalProcess {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String input = br.readLine();
System.out.println("processed[" + input + "]");
}
}
主要方法:
public class ProcessBuilderTest {
public static void main(String[] args) throws IOException, InterruptedException {
ProcessBuilder pb = new ProcessBuilder("C:\\Program Files\\Java\\jdk1.8.0_111\\bin\\java",
"-cp", //class path key
"C:\\Users\\redwhite\\IdeaProjects\\HelloMyWorld\\out\\production\\HelloMyWorld" , // path to class file of ExternalProcess class
"call_external.ExternalProcess"); // fully qualified name
Process process = pb.start();
OutputStream processOutputStream = process.getOutputStream();
IOUtils.write("1" + System.lineSeparator(), processOutputStream);
InputStream processInputStream = process.getInputStream();
System.out.println("--1--");
System.out.println(process.isAlive()); // outputs true
String result = IOUtils.toString(processInputStream, "UTF-8"); //<-- hangs here
System.out.println("--2--");
process.waitFor();
System.out.println(result); // expect to see processed[1]
}
}
此代码挂起。我无法理解为什么我不知道
IOUtils
类是什么,以及toString()
方法在做什么。但是,从InputStream
读取的一种方法是:
InputStreamReader isr;
BufferedReader br;
String input = "";
String line;
try {
isr = new InputStreamReader( p.getInputStream );
br = new BufferedReader( isr );
while( (line = br.readLine()) != null ) {
input += line + "\n";
}
} catch( Exception e ) {
e.printStackTrace();
}
如果我很理解您的问题,那么您正在寻找Java中与popen等效的函数。也许这个讨论可以帮助您:)
应关闭流,而不是在行末添加
\n
因此在更换之后
IOUtils.write("1" + System.lineSeparator(), processOutputStream);
与
代码正常工作了@Reimeus可能。。。我不知道怎么检查。在本例中,我在inputyour代码的末尾添加了System.lineSeparator()。这两个代码段有何关联?发布一个@Reimeus,它实际上是最小的、完整的等等。在代码的第一部分中,我调用了外部流程。第二个代码中提供了此过程的代码snippet@Reimeus新的ProcessBuilder(“C:\\Program Files\\Java\\jdk1.8.0\\U 111\\bin\\Java”、“-cp”、“project\U folder\\target\\classes package.ExternalProcess”);Emanuele Parisi,问题不在于搜索,而在于用法
IOUtils.write("1", processOutputStream);
processOutputStream.close();