Do I need to close InputStream after I close the Reader

No, you don't have to.

Since the decorator approach used for streams in Java can build up new streams or reader by attaching them on others this will be automatically be handled by InputStreamReader implementation.

If you look at its source you see that:

private final StreamDecoder sd;

public InputStreamReader(InputStream in) {
  sd = StreamDecoder.forInputStreamReader(in, this, (String)null);

public void close() throws IOException {

So the close operation actually closes the InputStream underlying the stream reader.

EDIT: I wanna be sure that StreamDecoder close works also on input stream, stay tuned.

Checked it, in

void implClose() throws IOException {
  if (ch != null)

which is called when sd's close is called.