【问题标题】:Call an exe from Java with passing parameters with writing to stdout and reading from stdin从 Java 调用 exe 并传递参数,写入标准输出并从标准输入读取
【发布时间】:2017-08-20 11:16:12
【问题描述】:

我读过这个问题: Java Programming: call an exe from Java and passing parameters

这个答案已经足够好了 https://stackoverflow.com/a/5604756/2674303

但我还想将参数传递给外部进程的标准输入并从该进程的标准输出中读取。

我该怎么做?

我的努力

主要方法:

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 + "]");
    }
}

这段代码挂了。我不明白为什么

【问题讨论】:

  • @Reimeus 也许......我不知道如何检查它。对于这种情况,我将 System.lineSeparator() 添加到输入的末尾
  • 您的代码不清晰。 2个代码sn-ps有什么关系?发布minimal reproducible example
  • @Reimeus 它真的是最小的,完整的等等。在代码的第一部分我调用外部进程。第二个代码sn -p中提供的这个过程的代码
  • @Reimeus new ProcessBuilder("C:\\Program Files\\Java\\jdk1.8.0_111\\bin\\java", "-cp", "project_folder\\target \\classes package.ExternalProcess");

标签: java exe stdout stdin processbuilder


【解决方案1】:

应该关闭流而不是在行尾添加\n 因此替换后

IOUtils.write("1" + System.lineSeparator(), processOutputStream);

IOUtils.write("1", processOutputStream);
processOutputStream.close();

代码可以正常工作

【讨论】:

    【解决方案2】:

    如果我很好地理解了您的问题,那么您正在 Java 中寻找与 popen 等效的函数。也许这个讨论可以帮助你:)

    Java: popen()-like function?

    【讨论】:

    • Emanuele Parisi,问题不在于搜索——关于使用的问题
    【解决方案3】:

    我不知道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();
    }
    
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-31
    • 2012-10-31
    • 2011-11-15
    • 1970-01-01
    • 1970-01-01
    • 2012-01-25
    • 2012-04-25
    相关资源
    最近更新 更多