The API for URLConnection and HttpURLConnection are (for better or worse) designed for the user to follow a very specific sequence of events:
- Set Request Properties
- (Optional) getOutputStream(), write to the stream, close the stream
- getInputStream(), read from the stream, close the stream
If your request is a POST or PUT, you need the optional step #2.
To the best of my knowledge, the OutputStream is not like a socket, it is not directly connected to an InputStream on the server. Instead, after you close or flush the stream, AND call getInputStream(), your output is built into a Request and sent. The semantics are based on the assumption that you will want to read the response. Every example that I’ve seen shows this order of events. I would certainly agree with you and others that this API is counterintuitive when compared to the normal stream I/O API.
The tutorial you link to states that “URLConnection is an HTTP-centric class”. I interpret that to mean that the methods are designed around a Request-Response model, and make the assumption that is how they will be used.
For what it’s worth, I found this bug report that explains the intended operation of the class better than the javadoc documentation. The evaluation of the report states “The only way to send out the request is by calling getInputStream.”