当前位置: 首页 > 面试题库 >

写入Java流程的InputStream

郭修平
2023-03-14
问题内容

我有一个通过以下代码启动Java进程的代码(即:执行已编译的Java代码)

ProcessBuilder builder = new ProcessBuilder("java", "Sample", "arg1", "arg2");
builder.redirectErrorStream(true);
Process process = builder.start();

通过这一点,我基本上可以处理输出和错误

OutputStream stdin = process.getOutputStream(); // <- Eh?
InputStream stdout = process.getInputStream();

BufferedReader reader = new BufferedReader(new InputStreamReader(stdout));
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(stdin));

// reader.readLine() blah blah

现在,如何将输入发送到stdin?也就是说,如果进程执行的代码中有一行等待输入,如下所示:

Scanner scan = new Scanner(System.in);
String val = scan.nextLine();
System.out.println(val);

我尝试了这个:

writer.write("I'm from the stdin!.");
writer.flush();

虽然什么都没发生。控制台仍在等待输入。

有什么想法吗?

编辑: 问题已得到回答,如下所示。我正在编辑以显示 错误的代码 (我未能包括btw。Lol)。

在开始之前writer.write(),我有一个

String line;
line = reader.readLine();
while (line != null) {
    System.out.println(line);
    line = reader.readLine();
}

问题答案:

Process OutputStream过程的角度来看,(我们的观点)是STDIN

OutputStream stdin = process.getOutputStream(); // write to this

因此,您所拥有的应该是正确的。

我的驱动程序(通过try-with-resources语句应用您自己的最佳实践)

public class ProcessWriter {
    public static void main(String[] args) throws Exception {
        ProcessBuilder builder = new ProcessBuilder("java", "Test");
        builder.directory(new File("C:\\Users\\sotirios.delimanolis\\Downloads"));
        Process process = builder.start();

        OutputStream stdin = process.getOutputStream(); // <- Eh?
        InputStream stdout = process.getInputStream();

        BufferedReader reader = new BufferedReader(new InputStreamReader(stdout));
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(stdin));

        writer.write("Sup buddy");
        writer.flush();
        writer.close();

        Scanner scanner = new Scanner(stdout);
        while (scanner.hasNextLine()) {
            System.out.println(scanner.nextLine());
        }
    }
}

我的应用程序

public class Test {

    public static void main(String[] args) throws Exception {
        Scanner console = new Scanner(System.in);
        System.out.println("heello World");
        while(console.hasNextLine()) {
            System.out.println(console.nextLine());
        }
    }
}

运行 驱动程序 打印

heello World
Sup buddy

由于某些原因,我需要close()。该flush()不会单独做到这一点。

*如果close()您提供而不是,它也可以 *编辑\n

所以用

writer.write("Sup buddy");
writer.write("\n");
writer.write("this is more\n");
writer.flush();

驱动程序打印

heello World
Sup buddy
this is more


 类似资料:
  • 问题内容: 我下面有以下代码示例。你可以在其中输入的命令,即回显结果。但是,先读后。其他输出流不起作用? 为什么会这样或我做错了什么?我的最终目标是创建一个线程计划任务,该任务定期执行对/ bash的命令,因此必须一前一后工作,而不能停止工作。我也一直在经历错误的任何想法? 谢谢。 问题答案: 首先,我建议更换生产线 与线 ProcessBuilder是Java 5中的新增功能,它使运行外部进程更

  • 现在准备要构建一个工具,用来把前面idata.txt里的数据按group分行显示,就像这样: 2 9 10 3 1 2 3 我们可以借助语法分析树的Listener机制来对词法分析结束后生成的记号流进行改写,我们不需要实现每一个Listener接口方法,只需要在捕获到group的时候把换行符插到它末尾就行。实现改写的代码如下所示: import org.antlr.v4.runtime.Toke

  • 问题内容: 我正在寻找从外部流程将数据写入现有流程的方法, @Michael在该线程中说,我们可以在如下所示的路径中获取现有进程的文件描述符,并允许在Linux上将数据写入它们。 因此,我创建了下面列出的简单脚本,以测试将数据从外部进程写入脚本(和)的过程。 这个测试脚本显示的路径和,然后,等待一个写它。 我启动了此脚本,并在下面收到了消息。 所以,我执行的命令和从其他终端。执行完这两个命令后,在

  • 问题内容: 我正在尝试创建一种控制台/终端,允许用户输入一个字符串,然后将其编入进程并打印出结果。就像普通的控制台一样。但是我在管理输入/输出流时遇到了麻烦。我已经研究了这个线程,但是可悲的是,该解决方案不适用于我的问题。 与标准命令(例如“ ipconfig”和“ cmd.exe”)一起,如果脚本要求输入,我还需要能够运行脚本并使用相同的输入流传递一些参数。 例如,在运行脚本“ python p

  • 主要内容:一、插入流程,二、源码分析,三、总结一、插入流程 在分析了整个SqlCmd的流程后,下来深入看一下插入数据要做的流程动作,数据库最常用的是查询,但是数据的插入也不遑多让。insert是DML操作,所以仍然从上篇的相关文件即sql_insert.cc开始看起,看它的execute这个虚拟函数是如何执行的,从这里出发,直到文件落盘,大致分为以下几步: 1、打开插入表并准备各种检查工作,包括区分Select类型的Insert等。 2、锁定

  • 前提须知 中间件能做表字段、表名、schema名自定义映射,支持源端与目标端表字段数据类型不一致默认转换,支持字段过滤; 支持通过实现接口做自定义业务逻辑(已有需求方在做自定义业务逻辑工作)。 准备 Mysql到关系型数据库同步 源端: 表结构信息: schema名 表名 源端目标端不