I need to read the input that is piped to my java program. This is a simple task but I couldn’t find it on the net.
This is what I tried:
private static String getInput() throws IOException { StringBuilder sb = new StringBuilder(); BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); String line; while ((line = reader.readLine()) != null) { sb.append(line); } return sb.toString(); }
First of all, is there a simpler way to do it (in java 11, or maybe with a library)? It seems like a lot of lines for such a simple task.
And mostly, it seems that it doesn’t work if there is no piped input, it hangs, when I just want it to return null for example.
Advertisement
Answer
Since Java 8, you can read all lines into a String<Stream>
:
private static String getInput() { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); return reader.lines().collect(Collectors.joining("n")); }
If you want to keep the newlines, you can use an overload for Collectors.joining()
, like Collectors.joining("n")
The problem with interactive input is: You may not know if there is an other line coming. So you have to signal end-of-file using your operating system input.
On windows this is the sequence Ctrl+Z, while on Linux it’s Ctrl+D