【问题标题】:End of stream reached when InputStream.read(array) does not return array.length?InputStream.read(array) 不返回 array.length 时到达流的结尾?
【发布时间】:2014-05-20 04:30:48
【问题描述】:

我有这些代码行:

final int packetLength = 64 //just some constant
InputStream in = socket.getInputStream();
byte[] packet = new byte[packetLength];
int read = in.read(packet, 0, packetLength)

if(read != packetLength) {
    //End of stream=
}

我能否确定如果read(byte[], int, int) 没有返回与其应读取的长度相同的值,则流已到达流的末尾?

因为下一个read() 调用应该返回-1 不是吗?

【问题讨论】:

    标签: java sockets byte bytearray inputstream


    【解决方案1】:

    不,你不能确定这一点。 InputStream 在读取您请求的所有数据之前不会阻塞 - 它会阻塞直到读取 一些 数据。 (InputStream 的默认实现 会一直读取,直到它可以读取所有内容,但不能保证子类实现会这样做。)

    您应该阅读直到 read 调用返回 -1 - 或者如果您只想准确阅读 packetLength 字节:

    byte[] packet = new byte[packetLength];
    int offset = 0;
    while (offset < packetLength) {
        int bytesRead = in.read(packet, offset, packetLength - offset);
        if (bytesRead == -1) { 
            // Incomplete packet - handle however you want to
        }
        offset += bytesRead;
    }
    // Hooray - read the complete packet.
    

    【讨论】:

    • 所以让上面示例中的in 是一个SocketInputStream,我应该一次又一次地调用read(byte[], int, int) 并且总是将数据附加到缓冲区直到最终读取方法返回 -1 或 packetLength 字节被读取?
    • @MinecraftShamrock:如果您只对阅读 packetLength 字节感兴趣,那很好。如果你想读到流的末尾,你需要一直读到read返回-1。
    • 我想读 packetLength 字节。但是到目前为止,如果读取的字节数少于packetLength,我将其作为流的结尾处理。所以我不想读到流的末尾,但我需要知道是否已经到达流的末尾。
    • @MinecraftShamrock:好的,我会编辑我的答案。
    • 非常感谢!这似乎是我遇到的一个非常讨厌的问题的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2018-11-07
    • 1970-01-01
    • 1970-01-01
    • 2018-10-15
    • 1970-01-01
    • 2011-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多