Warm tip: This article is reproduced from stackoverflow.com, please click
java

Get the result of the method and save it to a variable

发布于 2020-03-27 15:46:28

There is such code, I pass two parameters to the input and get the result of this method in the console, I need to save the result in a variable and pass it to another method how to do it right? Please do not rush tomatoes with a beginner in programming, I will be glad to any help. The result of the screen method.

enter image description here

  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;
}
Questioner
Николай Гнап
Viewed
26
res 2020-01-31 17:12

For you to get the result of Runtime.getRuntime().exec(command) into a variable, there is no need for a separate thread, you can simple read it right from your object Process and store in a String or StringBuilder, after this it is a matter of understanding the text and splitting it based on your rules.

To immediately read the result of a process:

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

After the code above you‘ll have all the text from the results in a String, now it is a matter of splitting it and/or removing unnecessary information. For this you can use the methods indexOf, split and removeAll combined, they are all methods inside the String class.

In you case, to make it simple we can divide the splitting in 3 stages. 1) Ignore the first empty line (\r\n) 2) Ignore the whole first line (command and arguments) 3) Use only the text starting from the position 0 until the next line break

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

Now your variable res has only the text you want to pass to another method.