[External] : Re: My experience using Java to do CLI Scripting

Stuart Marks stuart.marks at oracle.com
Tue Apr 15 18:12:39 UTC 2025



On 4/14/25 11:52 PM, Cay Horstmann wrote:
> * How exactly do I use getInputStream()/inputReader() with *extreme care*, as the 
> API doc warns me?

Ah. This is referring to the following note in the Process.getInputStream() method spec:

> API Note:
>     Use getInputStream() and inputReader() with extreme care. The BufferedReader may have buffered input from the input stream.

The issue here is that the the inputReader is some Reader implementation (presumably 
a BufferedReader) wrapped around the same InputStream as returned by 
getInputStream(). If a program interleaves operations on the InputStream with 
operations on the Reader, it's unspecified which bytes will go where, and the 
results probably won't be useful.

(This is the same issue is wrapping System.in with a 
InputStreamReader/BufferedReader or with a Scanner, using them, and then going back 
to System.in to read more bytes.)

Even setting aside BufferedReader, any CharsetDecoder is allowed to buffer "extra" 
bytes from its input. Thus, mixing operations on a Reader and an underlying 
InputStream is inherently ill-defined. Essentially if you want to read bytes, use 
the InputStream, but if you want characters, use a Reader, and you can't mix them.

Anyway the wording here is quite vague and should be clarified. It should also be 
made normative, and a similar clause should be added to inputReader(). And maybe 
elsewhere.

**

There is a *separate* issue discussed elsewhere on this thread, which is what's 
necessary to make sure any resources associated with Process are cleaned up 
properly. We've observed that the Unix *implementation* cleans up pipes when the 
subprocess terminates... but this doesn't seem to be supported by the specs. So 
there's another set of issues to deal with, and possible enhancements to let 
applications perform cleanup more reliably.

s'marks



More information about the core-libs-dev mailing list