繁体   English   中英

从Java进程读取InputStream

[英]Reading InputStream from Java Process

我试图打开一个终端控制台,并能够读取/写入命令。

我读了一些问题,例如: 具有输入/输出流的Java流程

有了这个功能,就可以构建一个小的应用程序,该应用程序可以打开终端并将命令传递到控制台并将结果打印回去,从而可以与任何系统命令(例如浏览文件夹,删除文件和类似内容)一起很好地工作。

我的问题是我需要从该控制台加载另一个Java程序并读取其输出,但是该程序使用java.util.logging.Logger发送其大部分输出,并且由于某种原因,我的启动应用无法读取什么Logger打印。

基本上,我试图为另一个Java应用程序构建一个包装器,因为我想与之交互但不能对其进行修改。

谢谢你的帮助。

编辑

这是代码,但是它基本上来自另一个问题,正如我所说的,它适用于“普通”标准输出中的内容,但不适用于Logger打印到控制台的输出。

package launcher;

import java.io.*;
import java.util.Scanner;

public class Launcher {

    public static void main(String[] args) throws IOException {

        String line;
        Scanner scan = new Scanner(System.in);

        Process process = Runtime.getRuntime().exec("/bin/bash");

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

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

        while (scan.hasNext()) {
            String input = scan.nextLine();
            if (input.trim().equals("exit")) {

                writer.write("exit\n");
            } else {
                writer.write("((" + input + ") && echo --EOF--) || echo --EOF--\n");
            }
            writer.flush();

            line = reader.readLine();
            while (line != null && !line.trim().equals("--EOF--")) {
                System.out.println("Stdout: " + line);
                line = reader.readLine();
            }
            if (line == null) {
                break;
            }
        }

    }
}

在没有看到任何代码/配置的情况下,我猜测记录器已配置为写入stderr(System.err),而您仅读取stdout(System.out),否则记录器已配置为写入文件。

根据dty的回答,我认为默认情况下java.util.logging使用stderr,因此您应该像这样将stderr重定向到stdout:

ProcessBuilder builder = new ProcessBuilder("ls", "-l"); // or whatever your command is
builder.redirectErrorStream(true);
Process proc = builder.start();

以我的经验,FWIW最好通过在自己的程序中启动其main方法来尝试使用其他Java程序,而不是尝试与输入/输出流等搏斗,但这要取决于其他程序的工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM