我有一个通过以下代码启动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名 表名 源端目标端不