我只是问了一个问题,为什么我的线程关闭不起作用。结果是因为 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)
?
3条答案
按热度按时间iqjalb3h1#
这个
available()
方法返回InputStream
s内部缓冲区。所以,我们可以这样做:
kxeu7u2r2#
你可以用
InputStream.available()
获取可读取字节数的估计值。引用javadoc:返回在不阻塞的情况下可以从此输入流读取(或跳过)的字节数的估计值,该值可能为0,或者在检测到流结束时为0。读取可能在同一个线程或另一个线程上。一次读取或跳过这么多字节不会阻塞,但可以读取或跳过更少的字节。
换句话说,如果
available()
退货n
,你知道你可以放心的打电话read(n)
没有阻塞。注意,正如javadoc所述,返回的值是一个估计值。例如,如果未达到eof,inflaterinputstream.available()将始终返回1。检查文件InputStream
您将使用的子类来确保它满足您的需要。ie3xauqp3#
您将需要实现自己的等效
BufferedInputStream
. 作为一个InputStream
以及一个线程(可能是从池中借来的)来阻塞。或者,使用nio实现。