我只是问了一个问题,为什么我的线程关闭不起作用。最终是由于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)
吗?
如果要获取字节以创建整数,则不应该使用阅读器。读者是文本。
您应该做的是使用类似这样的循环:
byte[] myBytes = new byte[numBytesNeeded];
int received = 0;
do {
received += inputStream.read(myBytes, received, numBytesNeeded - received);
} while (received < numBytesNeeded);
您可能希望查看DataFetcher。这使用回调模式,但只能在线程中运行