通过写入stdout并从stdin读取来传递参数,从Java调用exe
我读过这个问题: Java编程:从Java调用exe并传递参数
这个答案足够好了https://stackoverflow.com/a/5604756/2674303
但我还想将参数传递给外部进程的stdin并从此进程的stdout读取。
我怎样才能做到这一点?
我的努力 :
主要方法:
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] } }
ExternalProcess等待来自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 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 + "]"); } }
这段代码挂了。我无法理解为什么
我不知道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等效函数。 也许这个讨论可以帮到你:)
Java:popen() – 喜欢什么function?
而不是在行尾添加\n
,因此在更换后应关闭流
IOUtils.write("1" + System.lineSeparator(), processOutputStream);
同
IOUtils.write("1", processOutputStream); processOutputStream.close();
代码变得正常工作