GoForum🌐 V2EX

想问一个关于 IO 流的细节

pocketz · 2026-01-07 09:08 · 0 次点赞 · 5 条回复

问题

如果对一个 InputStream 调用 read 方法,在没有数据可读取的时候,理论上会处于阻塞状态。

This method blocks until input data is available, end of file is detected, or an exception is thrown.

那么如果一个 IO 流,曾经有数据可读取但已经被读取完毕,但后续仍有可能增加可读取的数据,此时调用 read ,是不是仍然属于这里所说的“blocks until input data is available”,也就是,是否会发生阻塞?

例子

我获取了 Process 的 InputStream ,里面的内容是这个进程的标准输出(以及错误输出)。
显然,进程的输出是间断性的,我想知道现有输出已经被读完的情况下,此时再调用 read ,是否还会处于阻塞状态?

    private ProcessBuilder dumpProcessBuilder;
    ...
    dumpProcessBuilder.redirectErrorStream(true);
    ...
    Process dumpProcess = dumpProcessBuilder.start();
    try (InputStream in = procForReader.getInputStream()) {
        byte[] buf = new byte[1024];
        int bytesRead = 0;
        while ((bytesRead = input.read(buf)) != -1) {
            output.write(buf, 0, bytesRead);
        }
    }
    ...
5 条回复
seedhk · 2026-01-07 09:13
#1

是的,仍然会

AoEiuV020JP · 2026-01-07 09:18
#2

这种比起自己硬想, 不如让 AI 直接写一个能测试这点的代码出来,实际跑一下看看更理解,

cnhongwei · 2026-01-07 09:18
#3

进程结束,流就会关闭,你读的时候就返回-1,不可能一直阻塞啊。如果没有关闭,就会阻塞。

dode · 2026-01-07 09:23
#4

会堵塞到进程退出吧,你测试看看

BingoXuan · 2026-01-07 09:33
#5

是的,系统就是这么设计的。除非你设置成异步 IO ,通过多路复用规避

添加回复
你还需要 登录 后发表回复

登录后可发帖和回复

登录 注册
主题信息
作者: pocketz
发布: 2026-01-07
点赞: 0
回复: 0