当前位置: 首页 > 面试题库 >

java BufferedReader的特定长度返回NUL个字符

南门新知
2023-03-14
问题内容

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

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

在大多数情况下,我都没问题,但是有时(收到的数千条消息中有1条),当尝试从读取器读取(长度)字节时,我只得到其中的一部分,其余的数组都用“
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;
    }


 类似资料:
  • 问题内容: 我有一个字符串“ ́aúlt”,我想根据字符位置等获得操纵的长度。问题在于第一个数字被计数两次,或者我猜数字在位置0而数字在位置1。 Python中是否有任何可能的方式来将像“ ́”这样的字符表示为1? 我正在将UTF-8编码用于输出的实际代码和网页。 编辑:关于为什么我需要这样做的一些背景。我正在做一个项目,该项目将英语翻译成塞内卡(一种美洲原住民语言),而„ ́出现了很多。某些单词

  • 本文向大家介绍找到字符串中最长的单词,并返回它的长度相关面试题,主要包含被问及找到字符串中最长的单词,并返回它的长度时的应答技巧和注意事项,需要的朋友参考一下 function findLongestWord(str){ // let arr=str.split(" "); let arr=str.replace(/[,|.|;]/," ").split(" "); let longLength=

  • 我想从中得到一个子字符串。 我想要的子字符串是一个数字字符序列。 输入 通常可以是任何字符串,但它们都有一个共同点: 有一个部分以KD-开头 并以数字结尾 数字之后的所有内容都将消失。 在上面的示例中,这个数字将分别为、、。但它可以是任何数字 现在我有一个子字符串,它包含KD之后的所有数字字符--但我希望只有字符串的0815ish部分。 我目前所拥有的 结果是,但我只想要(它可以是任何长度,但不可

  • 这是我的代码目前的样子: 现在我需要 Inno 做的是保持用户输入不变,如果它已经是 16 位数字,则在末尾填充 0,如果它小于 16(例如,如果它是一个 15 位,则只有一个 0,如果是 14 位,则只有一个,等等)。什么功能能够做到这一点?

  • 我正在youtube上观看关于BufferedReader的教程 https://www.youtube.com/watch?v=yofFVbARIRU 我写的代码和他写的一模一样,但我无法让它工作。我无法使BufferedReader代码正常工作,即使我使用 我用这个代码解决了它: 这也同样有效: 谁能给我解释一下第一个代码出了什么问题?因为这对指导他的人很管用

  • 问题内容: 我有一个元组,有100个姓氏。我如何在sqlite3中执行以下操作: 这样我就可以返回中包含的姓氏的所有记录。 问题答案: 问题 :返回所有记录中包含的姓氏 核心是创建一个查询,该查询具有与序列中一样多的绑定。 在需要排除最后一个逗号。 SQLite理解的SQL-子句 bindings = ‘?,’*len(surnames) QUERY = “select firstname, su