OutputStream 未转换为 String 变量

OutputStream not converting into a String varible

所以我开始考虑这将是一个简单的 1 或 2 行代码,以便我将 OutputStream 转换为字符串,以便我可以更好地检查它按照我的逻辑。

所以下面的代码是我目前正在使用的。如果我只是想将 output 写入 console,它 工作得很好 仅此而已。但是,我想将 output 存储为 string.

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

    try {
        p = Runtime.getRuntime().exec("cmd");
        new Thread(new SyncPipe(p.getErrorStream(), System.err)).start();
        new Thread(new SyncPipe(p.getInputStream(), System.out)).start();
        PrintWriter stdin = new PrintWriter(p.getOutputStream());
        stdin.println("cd C:/Local Apps/xxx/xxx/xxxx/eclipse");
        stdin.println("lscm login -r https://xxxx.xxxx.xxxx.xxxx:9443/ccm -n xxxx.xxxx.xxx.xxxx -u itsme -P gr^34dbtfgt7y");
        stdin.close();

        p.waitFor();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

}

class SyncPipe implements Runnable {
    public SyncPipe(InputStream istrm, OutputStream ostrm) {
        istrm_ = istrm;
        ostrm_ = ostrm;
    }

    public void run() {
        try {
            final byte[] buffer = new byte[1024];

            for (int length = 0; (length = istrm_.read(buffer)) != -1;) {
                ostrm_.write(buffer, 0, length);                    
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private final OutputStream ostrm_;
    private final InputStream istrm_;
}

我想从中获取数据:

ostrm_.write(buffer, 0, length);

我尝试了在 google:

上发现的各种东西
String string = new String(ostrm_.toString());
System.out.println(string);

String string = new String(ostrm_.toString("UTF-8"));
System.out.println(string);

final PrintStream blah = new PrintStream(ostrm_);
final String string = blah.toString();
System.out.println(string);

String blah = ostrm_.toString();
System.out.println(string);

byte[] blah = buffer;
String string = blah.toString();

我想我可以使用 OutputStreamWriter 之类的东西,但我似乎无法让它工作。所以如果有Java大师能帮我解决这个看似简单其实很难的问题就好了....

更新 1 用于启动和发动机罩:

请试试这个:

byte[] blah = buffer;
String string = new String(blah);

看来我终于明白了!

String line;
BufferedReader reader = new BufferedReader(new InputStreamReader(istrm_));

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

您的代码以非常困难的方式做事。要在特定工作目录中 运行 一个命令,并将输出发送到控制台,请使用 ProcessBuilder and inheritIO().

问题中的所有代码都可以简化为:

public static void main(String[] args) throws IOException {
    new ProcessBuilder("cmd", "/c",
                       "lscm", "login",
                       "-r", "https://xxxx.xxxx.xxxx.xxxx:9443/ccm",
                       "-n", "xxxx.xxxx.xxx.xxxx",
                       "-u", "itsme",
                       "-P", "gr^34dbtfgt7y")
            .directory(new File("C:/Local Apps/xxx/xxx/xxxx/eclipse"))
            .inheritIO()
            .start()
            .waitFor();
}

更新

要将命令的所有输出收集到一个字符串中,您首先要通过调用 redirectErrorStream(true) 而不是调用 inheritIO() 来组合 stdout 和 stderr,然后将输出收集到 String 使用适当的字符集。

以下使用平台默认值 Charset,因为这可能是命令输出的内容。

String[] command = {
        "cmd", "/c",
        "lscm", "login",
        "-r", "https://xxxx.xxxx.xxxx.xxxx:9443/ccm",
        "-n", "xxxx.xxxx.xxx.xxxx",
        "-u", "itsme",
        "-P", "gr^34dbtfgt7y" };
Process p = new ProcessBuilder(command)
        .directory(new File("C:/Local Apps/xxx/xxx/xxxx/eclipse"))
        .redirectErrorStream(true) // stderr > stdout
        .start();
p.getOutputStream().close(); // stdin < NUL
String output;
try (InputStream in = p.getInputStream()) {
    output = new String(in.readAllBytes());
}
int errorCode = p.waitFor();
System.out.print(output);
if (errorCode != 0)
    System.out.println("Program terminated with error code " + errorCode);

以上代码适用于 Java 9+。对于 Java 7+,像这样得到 output

try (InputStream in = p.getInputStream()) {
    ByteArrayOutputStream bytes = new ByteArrayOutputStream(1024);
    byte[] buf = new byte[1024];
    for (int len; (len = in.read(buf)) > 0; )
        bytes.write(buf, 0, len);
    output = bytes.toString();
}

您可以使用 readAllBytes() 并使用默认字符集创建 String

System.out.println(new String(istrm_.readAllBytes()));