According to the documentation of InputStream.readNBytes:
Reads up to a specified number of bytes from the input stream. This
method blocks until the requested number of bytes have been read, end
of stream is detected, or an exception is thrown. This method does not
close the input stream.
However, despite a comment, currently it may not necessarily read up to
EOF. The problem is in a small result checking error:
// read to EOF which may read more or less than buffer size
while ((n = read(buf, nread,
Math.min(buf.length - nread, remaining))) > 0) {
nread += n;
remaining -= n;
}
That "> 0" is incorrect here; it's allowed to return 0 before EOF has
been reached. It should be ">= 0", "> -1" or "!= -1", all of which
correctly treat 0 and only break the loop once the read operation
returns -1. Based on what's used in transferTo the best choice is
probably ">= 0", to remain consistent in the same file.