gpt4 book ai didi

Java PipedInputStream available()方法返回值

转载 作者:搜寻专家 更新时间:2023-11-01 03:28:17 26 4
gpt4 key购买 nike

我正在尝试编写一段解锁代码来读取 PipedInputStream .它基本上会在调用阻塞读取 API 之前检查是否有任何内容要读取:

int n = 0;
if ((n = pipedInputStream_.available()) > 0) {
pipedInputStream_.read(...)
}

通读 java API doc我无法确定该检查应该是什么,因为可能的值为零(表示没有数据,或关闭/损坏的流)或大于零。那么调用者如何才能知道是否有任何内容需要读取呢?

"Returns the number of bytes that can be read from this input stream without blocking, or 0 if this input stream has been closed by invoking its close() method, or if the pipe is unconnected, or broken."

查看源代码似乎唯一的值是零或大于零。

public synchronized int available() throws IOException {
if(in < 0)
return 0;
else if(in == out)
return buffer.length;
else if (in > out)
return in - out;
else
return in + buffer.length - out;
}

最佳答案

如果 available() 返回零,则当前没有可读取的字节。根据您引用的文档,可能出于以下几个原因:

  • 管道已关闭。
  • 管道坏了。
  • 所有先前可用的输入(如果有的话)都已被消耗。

available() 的零返回值 可能 暗示发生了错误,暗示您将永远无法通过管道中的管道读取更多数据 future ,但你不能在这里确定,因为零可能表示上面的第三个条件,在 InputStream#read() 上阻塞最终可能会产生比相应的 OutputStream< 更多的数据 端将推过管道。

在更多数据可用之前,我不认为可以使用 available() 轮询 PipedInputStream,因为您永远无法区分终端以上案例(第一个和第二个)来自读者比作者更饥饿。像许多流接口(interface)一样,在这里您也必须尝试使用并准备好失败。那就是陷阱; InputStream#read() 将阻塞,但直到您 promise 阻塞读取尝试时,您才能辨别出没有更多的输入到来。

将您的消费行为基于available() 是不可行的。如果它返回一个正数,则有东西 可供阅读,但当然,即使现在可用的东西也可能“不足以”满足您的消费者。如果您提交线程以阻塞方式使用 InputStream 并跳过使用 available() 的轮询,您会发现您的应用程序更易于管理。让 InputStream#read() 成为您的唯一预言机。

关于Java PipedInputStream available()方法返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7534991/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com