【发布时间】:2019-09-04 06:38:58
【问题描述】:
InputStream.available() javadoc:
返回可以从中读取(或跳过)的字节数 此输入流无阻塞
我认为阻塞意味着我调用
read()的线程被阻塞(控制流不会进一步),直到read()返回。从这个意义上说,我看不到任何可以在没有阻塞的情况下调用 read() 的场景。阻塞的另一个含义可能是,如果我想读取 3 个字节并且没有或只有 1 个字节可用,
read()将阻塞并等待更多字节出现 - 但我无法理解方式 b/c 然后调用read()并尝试读取超过可用的内容可能会导致永久阻塞(只是从 10 个字节的文件中读取 100 个字节)。
java.io 在哪种意义上阻塞 (1) 或 (2)?
我无法模拟使用 FileInputStream 或 ByteArrayInputStream 读取 IO 块的方法(意义(2))时的情况:
// file content is: 1 2 3
FileInputStream myStream = new FileInputStream("d:\\file.txt");
byte[] b = new byte[100];
myStream.read(b);
System.out.println("control reached here?");
System.out.println(Arrays.toString(b));
输出:
reached here?
[122, 100, 122, 120, 118, 122, 120, 32, 118, 122, 120, 118, 32, 122, 120, 118, 32, 122, 118, 99, 122, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
第二次调用 myStream.read(b) 也只会返回 -1 而不会阻塞。
在什么情况下会发生阻塞?
我认为如果我尝试读取 5 个字节并且有 3 个字节,就会发生这种情况。如果没有,则表示 EOF / end-of-stream 并返回 -1(也没有阻塞)。
附:我倾向于认为 java.io 既是 (1) 又是 (2):它是同步的 (1) 和阻塞的 (2),但实际上只有在使用套接字时才能观察到阻塞 (@987654329 @)。
【问题讨论】: