Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.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
通过向stdout写入参数和从stdin读取参数,从Java调用exe_Java_Exe_Stdout_Stdin_Processbuilder - Fatal编程技术网

通过向stdout写入参数和从stdin读取参数,从Java调用exe

通过向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

我看过这个问题:

这个答案很好

但我还想将参数传递给外部进程的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 + "]");
    }
}
主要方法:

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();