最近学习java,遇到个很奇妙的问题,关于IO方面的,输入流的 read (byte[] b,int off,int len)方法

问题遇到的现象和发生背景

最近学习java,遇到个很奇妙的问题
Inputstream的 read (byte[] b,int off,int len) ,这个方法是读取len个字节的数据到数组b上,但底层代码也是循环调用read()方法一个一个读取的,我想问的是为什么这样读取的字节数 小于 len长度 时,不会阻塞而是返回读取到的字节数呢?

问题相关代码,请勿粘贴截图

read (byte[] b,int off,int len) 源码
public int read(byte b[], int off, int len) throws IOException {
if (b == null) {
throw new NullPointerException();
} else if (off < 0 || len < 0 || len > b.length - off) {
throw new IndexOutOfBoundsException();
} else if (len == 0) {
return 0;
}

    int c = read();
    if (c == -1) {
        return -1;
    }
    b[off] = (byte)c;

    int i = 1;
    try {
        for (; i < len ; i++) {
            c = read();
            if (c == -1) {
                break;
            }
            b[off + i] = (byte)c;
        }
    } catch (IOException ee) {
    }
    return i;
}

本人写了一个客户端的进程代码:
public static void main(String[] args) throws IOException {
Socket socket = new Socket("127.0.0.1", 8888);
int len;
InputStream is=socket.getInputStream();
OutputStream os=socket.getOutputStream();
byte[] data=new byte[10];
//写入10字节数据 发送到服务端
os.write(data);
//休眠10s
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//中断输出流 写入流末尾标记
socket.shutdownOutput();
}
然后这是服务端的:
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8888);
System.out.println("等待");
Socket socket = serverSocket.accept();
System.out.println("连接成功");
InputStream is=socket.getInputStream();
OutputStream os=socket.getOutputStream();
int len;
byte[] data=new byte[20];
//读取20个字节长度的数据
len=is.read(data,0,data.length);//返回读入数组的总字节数
System.out.println(len);
}

运行结果及报错内容

打印了10

我的解答思路和尝试过的方法

按照思路,客户端发送10个字节的数据,服务端接收,进入is.read(data,0,data.length);方法
然后循环,一个字节一个字节的读取数据,放入data数组中,读取完第十个字节数据的时候,下一次循环
read()方法读取不到可用字节数,不是应该阻塞,直到客户端执行 socket.shutdownOutput();,才读取到
流末尾标记,返回读取到的字节数吗?
为什么这边不会阻塞,而是直接返回读取到的字节数

我想要达到的结果

读完第十个字节,下一次读取,应该是发现没有可读字节了,返回-1,从而跳出循环。(可以设置断点调试一下)。

没有可读字节,返回-1就直接结束了,为啥要阻塞呢。如果按你的理解,没有可读的数据一直阻塞,那下一个程序如果还要读取时岂不是无法正常操作了。任何一个方法,都不会说因为没有数据而阻塞,都是会将读取到的数据返回然后结束方法

读取完第十个字节,下一次读取时,发现没有可读字节了就返回-1直接结束了