OutputStream не преобразуется в строковую переменную - PullRequest
1 голос
/ 25 сентября 2019

Поэтому я подумал, что это будет простой 1 или 2-строчный код, чтобы я мог преобразовать OutputStream в строку, чтобы я мог лучше проверить его с помощью своей логики.

Так что код ниже - это то, с чем я сейчас работаю.Это прекрасно работает , если я просто хочу записать вывод на консоль и все.Однако я хочу сохранить этот вывод в виде строки .

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 для boot-and-bonnet:

enter image description here

Ответы [ 4 ]

1 голос
/ 26 сентября 2019

Вы можете использовать readAllBytes() и создать String, используя набор символов по умолчанию:

System.out.println(new String(istrm_.readAllBytes()));
0 голосов
/ 25 сентября 2019

Похоже, я наконец-то понял!

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

while ((line = reader.readLine()) != null) {
    System.out.println(line);
}
0 голосов
/ 25 сентября 2019

Ваш код делает вещи очень сложным способом.Чтобы запустить команду в определенном рабочем каталоге и отправить вывод на консоль, используйте ProcessBuilder и 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();
}

ОБНОВЛЕНИЕ

Чтобы собрать все выходные данные команды в одну строку, вы должны сначала объединить stdout и stderr, вызвавredirectErrorStream(true) вместо вызова inheritIO(), затем соберите вывод в 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();
}
0 голосов
/ 25 сентября 2019

Пожалуйста, попробуйте это:

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