C#,java DataInputStream.readFully()等价

时间:2013-12-26 09:14:50

标签: c# sockets stream windows-store-apps

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

  

方法从输入流中读取字节并将其分配到   缓冲阵列b。

     

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

2 个答案:

答案 0 :(得分:5)

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

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

  

包含从基础流读取的数据的字节数组。这个   可能小于结束时请求的字节数   流已到达。

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

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();
    }
}

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

byte[] buffer = new byte[8192];
myNetworkStream.ReadFully(buffer);

答案 1 :(得分:0)

也许您正在寻找binary reader