Il 14/04/25 23:46, Ron Pressler ha scritto:


On 14 Apr 2025, at 21:48, Remi Forax <fo...@univ-mlv.fr> wrote:


Hi Ron,
i think you need to close the inputReader

  public static String output(String... args) {
    ProcessBuilder processBuilder = new ProcessBuilder(args);
    try {
      Process process = processBuilder.start();
      try (BufferedReader reader = process.inputReader()) {
        return reader.lines().collect(Collectors.joining("\n"));
      }
    } catch (IOException e) {
      throw new IOError(e);
    }
  }


When the process terminates, the InputStream underlying the pipe is closed 
(after being drained and the unread bytes served by a ByteArrayInputStream), 
which *I think* should be sufficient, but I could be wrong.

— Ron

Reading the process output into a string or string stream raises a number of 
worries.

* Do I need to wait for the process to complete?
* Do I need to close anything?
* How exactly do I use getInputStream()/inputReader() with *extreme care*, as 
the API doc warns me?

If it is safe to call

  builder.start().inputReader().lines()

or

  builder.start().getInputStream().readAllBytes()

without waiting or closing, then the API doc could say so. If not, then maybe a 
safe method to get the entire output would be appropriate for Process?


--

Cay S. Horstmann | https://horstmann.com

Reply via email to