java—无阻塞地原子读取n字节

bbmckpt7  于 2021-07-12  发布在  Java
关注(0)|答案(3)|浏览(446)

我只是问了一个问题,为什么我的线程关闭不起作用。结果是因为 readLine() 在关闭标志被识别之前阻塞我的线程。这很容易通过检查来解决 ready() 打电话之前 readLine() .
不过,我现在用的是 DataInputStream 依次执行以下操作:

int x = reader.readInt();
int y = reader.readInt();
byte[] z = new byte[y]
reader.readFully(z);

我知道我可以实现自己的缓冲区,在加载缓冲区时检查正在运行的文件标志。但我知道这会很乏味。相反,我可以让数据在 InputStream 上课,等我有空再上课 n 字节读取,在执行非阻塞读取之前-因为我知道我需要读取多少。 4 第一个整数的字节数 4 第二个整数的字节数 y 以及 y 的字节数 z 字节数组。
而不是使用 ready() 要检查缓冲区中是否有行,是否有等效的行 ready(int bytesNeeded) ?

iqjalb3h

iqjalb3h1#

这个 available() 方法返回 InputStream s内部缓冲区。
所以,我们可以这样做:

while (reader.available() < 4) checkIfShutdown();
reader.readInt();
kxeu7u2r

kxeu7u2r2#

你可以用 InputStream.available() 获取可读取字节数的估计值。引用javadoc:
返回在不阻塞的情况下可以从此输入流读取(或跳过)的字节数的估计值,该值可能为0,或者在检测到流结束时为0。读取可能在同一个线程或另一个线程上。一次读取或跳过这么多字节不会阻塞,但可以读取或跳过更少的字节。
换句话说,如果 available() 退货 n ,你知道你可以放心的打电话 read(n) 没有阻塞。注意,正如javadoc所述,返回的值是一个估计值。例如,如果未达到eof,inflaterinputstream.available()将始终返回1。检查文件 InputStream 您将使用的子类来确保它满足您的需要。

ie3xauqp

ie3xauqp3#

您将需要实现自己的等效 BufferedInputStream . 作为一个 InputStream 以及一个线程(可能是从池中借来的)来阻塞。或者,使用nio实现。

相关问题