温馨提示:本文翻译自stackoverflow.com,查看原文请点击:java - Get the result of the method and save it to a variable
java

java - 获取方法的结果并将其保存到变量

发布于 2020-03-27 16:16:11

有这样的代码,我将两个参数传递给输入并在控制台中获取此方法的结果,我需要将结果保存到变量中并将其传递给另一个方法该如何正确执行?请不要在编程方面与新手着急,我将很高兴为您提供帮助。屏幕方法的结果。

在此处输入图片说明

  public static String activation(String serialNumber, String keyName) throws IOException, InterruptedException, SQLException {
    LocalDate futureDate = LocalDate.now().plusMonths(12);
    String formattedDate = futureDate.format(DateTimeFormatter.ofPattern("yyyyMMdd"));
    String[] command =
            {
                    "cmd",
            };
    Process p = Runtime.getRuntime().exec(command);
    //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("C:\\tdes_ecb.exe " + serialNumber + " " + keyName + " " + formattedDate);

    stdin.close();

    int returnCode = p.waitFor();
    String code = Integer.toString(returnCode);

    return code;
}

static class SyncPipe implements Runnable {
    public SyncPipe(InputStream istrm, OutputStream ostrm) {
        inputStream = istrm;
        outputStream = ostrm;

    }

    public void run() {
        try {


            final byte[] buffer = new byte[1024];
            for (int length = 0; (length = inputStream.read(buffer)) != -1; ) {
                outputStream.write(buffer, 0, length);


                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < buffer.length; i++) {
                    char c = (char) buffer[i];
                    sb.append(c);
                }
                String convertedString = sb.toString();

                key(convertedString);


            }


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

    private final OutputStream outputStream;
    private final InputStream inputStream;
}

public void SyncPipe(InputStream inputStream, OutputStream outputStream) {
    this.inputStream = inputStream;
    this.outputStream = outputStream;
}

查看更多

查看更多

提问者
Николай Гнап
被浏览
15
res 2020-01-31 17:12

为了将结果Runtime.getRuntime().exec(command)转换成变量,不需要单独的线程,您可以直接从对象中简单读取它Process并存储在String或中StringBuilder,这之后便是了解文本并根据以下内容进行拆分的问题你的规则。

要立即读取过程结果:

final StringBuilder ret = new StringBuilder();

final Runtime rt = Runtime.getRuntime();
final String[] commands = { "cmd", "/c", "cd c:\\myuser" };

final Process proc = rt.exec(commands);

final BufferedReader stdInput = new BufferedReader(new InputStreamReader(proc.getInputStream()));
final BufferedReader stdError = new BufferedReader(new InputStreamReader(proc.getErrorStream()));

String s = null;

while ((s = stdInput.readLine()) != null) {
    ret.append(s).append("\n");
}

while ((s = stdError.readLine()) != null) {
    ret.append(s).append("<br />");
}
String res = ret.toString();

上面的代码之后,您将结果中的所有文本都包含在中String,现在只需拆分和/或删除不必要的信息即可。为此,您可以使用方法indexOfsplit并将removeAll它们组合在一起,它们都是String类中的所有方法。

在您的情况下,为简单起见,我们可以将拆分分为三个阶段。1)忽略第一行(\ r \ n)2)忽略第一行(命令和参数)3)仅使用从位置0开始直到下一行的文本

String res = "\r\nC:\\User\\aaa\\bbb\\ccc\\tdex_ecb.exe 000000 111111 33333 44444 \r\n INFO I WANT\r\n C:\\\\User\\\\aaa\\\\bbb\\\\ccc\\\\";

res = res.substring(2);
res = res.substring(res.indexOf("\r\n")+2);
res = res.substring(0, res.indexOf("\r\n"));

System.out.println(res);

现在,您的变量res只有要传递给另一个方法的文本。