【问题标题】:OutputStream not converting into a String varibleOutputStream 未转换为字符串变量
【发布时间】:2020-01-26 02:05:09
【问题描述】:

所以我开始考虑这将是一个简单的 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);

我尝试了各种我在谷歌上找到的东西:

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 用于引导和发动机罩:

【问题讨论】:

  • 从输出流中获取数据没有意义。您已经提供了要写入的数据。这就是数据。
  • @user207421 你是对的但是我想把它保存到一个变量中,而不是把它写到控制台。

标签: java multithreading byte runnable outputstream


【解决方案1】:

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

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

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();
}

【讨论】:

  • 这确实有效,但我的问题是如何将输出转换为字符串变量。
  • 您能说明如何使用您的方式获得输出吗?
【解决方案2】:

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

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

【讨论】:

  • 我没有 readAllBytes() 的选项。有关此更新,请参阅 OP。
  • 看起来它可以从 Java 9 获得
  • 啊,这就是原因。我正在使用 8。
【解决方案3】:

看来我终于明白了!

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

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

【讨论】:

    【解决方案4】:

    请试试这个:

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

    【讨论】:

      猜你喜欢
      • 2010-09-18
      • 2010-09-30
      • 2011-08-27
      • 2010-12-04
      • 2017-10-01
      相关资源
      最近更新 更多