原子读取n个字节而不会阻塞

问题描述 投票:0回答:1

我只是问了一个问题,为什么我的线程关闭不起作用。最终是由于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)吗?

java multithreading stream inputstream
1个回答
0
投票

如果要获取字节以创建整数,则不应该使用阅读器。读者是文本。

您应该做的是使用类似这样的循环:

byte[] myBytes = new byte[numBytesNeeded];
int received = 0;
do {
  received += inputStream.read(myBytes, received, numBytesNeeded - received);
} while (received < numBytesNeeded);

您可能希望查看DataFetcher。这使用回调模式,但只能在线程中运行

© www.soinside.com 2019 - 2024. All rights reserved.