gpt4 book ai didi

java BufferedReader 特定长度返回NUL字符

转载 作者:行者123 更新时间:2023-12-02 00:51:52 27 4
gpt4 key购买 nike

我有一个 TCP 套接字客户端从服务器接收消息(数据)。消息的类型为长度(2 个字节)+ 数据(长度字节),由 STX 和 ETX 字符分隔。

我使用 bufferedReader 检索前两个字节,解码长度,然后再次从同一个 bufferedReader 读取适当的长度并将结果放入字符数组中。

大多数时候,我没有问题,但有时(收到的数千条消息中的第一条),当尝试从阅读器读取(长度)字节时,我只得到其中的一部分,数组的其余部分是填充“NUL”字符。我想这是因为缓冲区尚未填充。

char[] bufLen = new char[2];
_bufferedReader.read(bufLen);

int len = decodeLength(bufLen);

char[] _rawMsg = new char[len];
_bufferedReader.read(_rawMsg);

return _rawMsg;

我通过几种迭代方式解决了这个问题:

  • 首先我测试了数组的最后一个字符:如果它不是 ETX,我会从 bufferedReader 中一个接一个地读取字符,直到到达 ETX,然后重新开始我的常规例程。这结果是我基本上会删除一条消息。

  • 然后,为了仍然检索该消息,我会在“截断”消息中找到 NUL 字符的第一次出现,一次读取并存储一个附加字符,直到到达 ETX,然后附加它们对于我的“截断”消息,确认长度没问题。

它也有效,但我真的认为我可以做得更好,比如在读取之前检查缓冲区中是否有我需要的字符总数,但找不到正确的方法来做到这一点...

有什么想法/指针吗?

谢谢!

最佳答案

InputStream 读取方法可能会返回短读取;您必须检查返回值以确定读取了多少个字符,并继续循环读取,直到获得所需的数量。该方法可能会阻塞,但它只会阻塞直到一些数据可用,而不一定是您请求的所有数据。

大多数人最终都会编写一个“readFully”方法,例如 DataInputStream,它会读取预期的数据量,或者抛出 IOException:

static public int readFully(InputStream inp, byte[] arr, int ofs, int len) throws IOException {
int rmn,cnt;

for(rmn=len; rmn>0; ofs+=cnt, rmn-=cnt) {
if((cnt=inp.read(arr,ofs,rmn))==-1) {
throw new IOException("End of stream encountered before reading at least "+len+" bytes from input stream");
}
}
return len;
}

关于java BufferedReader 特定长度返回NUL字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2687736/

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