首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >写入Java进程的InputStream

写入Java进程的InputStream
EN

Stack Overflow用户
提问于 2013-09-20 03:41:52
回答 3查看 42.6K关注 0票数 25

我有一段启动java进程(即:执行编译后的java代码)的代码,通过

代码语言:javascript
运行
复制
ProcessBuilder builder = new ProcessBuilder("java", "Sample", "arg1", "arg2");
builder.redirectErrorStream(true);
Process process = builder.start();

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

代码语言:javascript
运行
复制
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?也就是说,如果进程执行的代码有一行等待输入,如下所示:

代码语言:javascript
运行
复制
Scanner scan = new Scanner(System.in);
String val = scan.nextLine();
System.out.println(val);

我试过这个:

代码语言:javascript
运行
复制
writer.write("I'm from the stdin!.");
writer.flush();

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

有什么想法吗?

编辑:问题已回答,如下所示。我正在编辑以显示错误代码(我没有包含btw。哈哈)。

writer.write()部分之前,我有一个

代码语言:javascript
运行
复制
String line;
line = reader.readLine();
while (line != null) {
    System.out.println(line);
    line = reader.readLine();
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-09-20 03:44:18

从流程的角度来看,Process OutputStream (我们的观点)就是标准输入

代码语言:javascript
运行
复制
OutputStream stdin = process.getOutputStream(); // write to this

所以你所拥有的应该是正确的。

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

代码语言:javascript
运行
复制
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());
        }
    }
}

我的应用程序

代码语言:javascript
运行
复制
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());
        }
    }
}

运行驱动程序打印

代码语言:javascript
运行
复制
heello World
Sup buddy

出于某种原因,我需要close()。仅靠flush()是无法做到这一点的。

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

所以有了

代码语言:javascript
运行
复制
writer.write("Sup buddy");
writer.write("\n");
writer.write("this is more\n");
writer.flush();    

驱动程序打印

代码语言:javascript
运行
复制
heello World
Sup buddy
this is more
票数 51
EN

Stack Overflow用户

发布于 2021-11-29 14:07:30

这是一个例子,也许可以帮助某些人

代码语言:javascript
运行
复制
import java.io.IOException;
import java.io.File;
import java.io.OutputStream;
import java.io.InputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) throws IOException {
        String[] commands = {"C:/windows/system32/cmd.exe"};
        ProcessBuilder builder = new ProcessBuilder(commands);
        builder.directory(new File("C:/windows/system32"));
        Process process = builder.start();

        OutputStream stdin = process.getOutputStream();
        InputStream stdout = process.getInputStream();
        InputStream stderr = process.getErrorStream();

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

        new Thread(() -> {
            String read;
            try {
                while ((read = reader.readLine()) != null) {
                    System.out.println(read);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }).start();

        new Thread(() -> {
            String read;
            try {
                while ((read = error.readLine()) != null) {
                    System.out.println(read);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }).start();

        new Thread(() -> {
            while (true) {
                try {
                    Scanner scanner = new Scanner(System.in);
                    writer.write(scanner.nextLine());
                    writer.newLine();
                    writer.flush();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }
}
票数 2
EN

Stack Overflow用户

发布于 2019-08-21 19:09:07

您需要添加结束行字符("\n")。

像这样:

代码语言:javascript
运行
复制
writer.write("I'm from the stdin!.\n");
writer.flush();
票数 -5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18903549

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档