【问题标题】:At which instance does reading an InputStream.read() return a positive integer and when does it return -1?在哪个实例读取 InputStream.read() 返回正整数,何时返回 -1?
【发布时间】:2017-11-27 23:03:21
【问题描述】:

我对@9​​87654321@ 的工作方式有一些疑问。我正在尝试收听InputStream,只要有可用字节,我就需要将它们复制到字节数组中,然后将字节数组移交给另一种方法进行进一步处理,然后返回收听 InputStream 进行下一步一组字节。以下是我的成绩:

while(true){
    while((i = inputstream.read(recvBuffer, 0, recvBuffer.length)) != -1){
    doSomething(recvBuffer);
    }
}

我读到read(byte[] b, int off, int len) 方法返回一个int,它应该表示从流中读取的字节数。这是否意味着只要字节可用,它将i 的值设置为相应的字节数?一旦它读取x字节数并到达流的末尾,它不会返回一个表示字节数的正整数,而不是-1吗?那么,对-1 的检查何时会针对i 进行?我知道我在解释这个错误,但我不能说如何。任何理解这一点的帮助将不胜感激

另外,我知道发送方可以推送到流中的最大字节数。在这种情况下,将recvBuffer 的大小指定为最大字节数是否就足够了,还是谨慎分配更多?

【问题讨论】:

  • 没有。在流结束时,它返回-1(表示流结束)。
  • 您应该将读取的字节数传递给您的 doSomething 方法,以便在解析字节数组时更轻松

标签: java stream network-programming


【解决方案1】:
doSomething(recvBuffer);

应该是这样的

doSomething(recvBuffer, i);

该方法需要知道实际接收了多少字节。

我读到 read(byte[] b, int off, int len) 方法返回一个 int,它应该表示从流中读取的字节数。

正确。

这是否意味着只要字节可用,它就会设置 i 到各自的字节数?

是的。

一旦读取 x 个字节 并到达流的末尾,它不会返回一个正数吗 表示字节数的整数,而不是-1?

不,它传输字节并返回计数,然后下一次没有字节,只有流结束,所以它返回-1。

那么,对 -1 的检查何时会发生在 i 上?我知道我在解释这个 错了,但我不能说怎么做。

见上文。

另外,我知道发送方可以推送到流中的最大字节数。在这种情况下,是否将 recvBuffer 的大小指定为最大字节数就足够了,还是谨慎分配更多?

大多数人使用 4096 或 8192 字节。实际上,指定一个大于路径 MTU 的缓冲区并没有多大意义,通常小于 1500,除非您读取速度很慢,以至于内核套接字接收缓冲区被填满。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-25
    • 2018-09-05
    • 1970-01-01
    • 2015-05-11
    • 2015-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多