从Java进程读取InputStream

从Java进程读取InputStream,java,Java,我试图打开一个终端控制台,并能够读/写命令到它 我读了一些问题,比如: 有了它,我们就可以构建一个小应用程序,打开终端,将命令传递到控制台,并将结果打印回来。它可以与任何系统兼容,比如浏览文件夹、删除文件等等 我遇到的问题是,我需要从该控制台加载另一个java程序并读取其输出,但该程序使用java.util.logging.Logger发送其大部分输出,出于某种原因,我的启动应用程序无法读取记录器打印的内容 基本上,我试图为另一个java应用程序构建一个包装器,因为我想与它交互,但无法修改它

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

我读了一些问题,比如:

有了它,我们就可以构建一个小应用程序,打开终端,将命令传递到控制台,并将结果打印回来。它可以与任何系统兼容,比如浏览文件夹、删除文件等等

我遇到的问题是,我需要从该控制台加载另一个java程序并读取其输出,但该程序使用java.util.logging.Logger发送其大部分输出,出于某种原因,我的启动应用程序无法读取记录器打印的内容

基本上,我试图为另一个java应用程序构建一个包装器,因为我想与它交互,但无法修改它

谢谢你的帮助

编辑

这是代码,但它基本上来自另一个问题,正如我所说,它适用于“正常”标准输出,但不适用于输出记录器打印到控制台

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程序,而不是尝试处理输入/输出流等,但这取决于另一个程序的功能。

您在这里没有给我们太多介绍,我们基本上是在猜测。。。如果记录器正在打印到STD OUT,那么这应该可以工作,但它可能是记录到文件,或者打印到STD错误,或者混合执行这些操作。你完全正确,我应该在凌晨4点停止这样做。非常感谢。是的,问题是我只是在读标准输出,默认情况下,记录器将其信息保存到标准输出。