C#,java DataInputStream.readFully()等价

Bor*_*sky 1 c# sockets stream windows-store-apps

我写的是C#windows store应用程序,我通过Sockets接收数据.我想知道,java DataInptStream.ReadFully()是否有任何C#quivalent方法.正如这里所写http://www.tutorialspoint.com/java/io/datainputstream_readfully.htm

方法从输入流中读取字节并将其分配到缓冲区数组b中.

它会阻塞,直到出现以下条件之一:输入数据的b.length个字节可用.C#中是否有任何等效方法?那个woul会等到字节长度可用吗?

Tho*_*rin 5

这里缺少Java文档中的一些文本,但据我所知,您需要一个方法来准确读取缓冲区大的字节数,或者在抛出某种异常时失败.

BinaryReader.ReadBytes (由No One建议)不是这样的:

包含从基础流读取的数据的字节数组.这可能小于达到流末尾时请求的字节数.

据我所知,没有其他方法具有等效行为,但您可以使用扩展方法创建它:

public static void ReadFully(this Stream stream, byte[] buffer)
{
    int offset = 0;
    int readBytes;
    do
    {
        // If you are using Socket directly instead of a Stream:
        //readBytes = socket.Receive(buffer, offset, buffer.Length - offset,
        //                           SocketFlags.None);

        readBytes = stream.Read(buffer, offset, buffer.Length - offset);
        offset += readBytes;
    } while (readBytes > 0 && offset < buffer.Length);

    if (offset < buffer.Length)
    {
        throw new EndOfStreamException();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用该扩展方法,就好像它是Stream类的一部分一样,假设您已导入其定义的命名空间:

byte[] buffer = new byte[8192];
myNetworkStream.ReadFully(buffer);
Run Code Online (Sandbox Code Playgroud)