从不知道要多少期待的流中读取[c#]

时间:2009-05-07 13:18:31

标签: c# arrays stream

当我事先不知道会有多少数据进入时,如何从流中读取?现在我只选了一个偏高的数字(如下面的代码所示),但不能保证我不会得到更多。

所以我在循环中一次读取一个字节,每次调整数组大小?听起来像是要做太大的调整: - /

TcpClient tcpclnt = new TcpClient();
tcpclnt.Connect(ip, port);

Stream stm = tcpclnt.GetStream();

stm.Write(cmdBuffer, 0, cmdBuffer.Length);

byte[] response = new Byte[2048];
int read = stm.Read(response, 0, 2048);

tcpclnt.Close();

6 个答案:

答案 0 :(得分:6)

MemoryStream是你的朋友

http://msdn.microsoft.com/en-us/library/system.io.memorystream

构造没有默认大小,它将自动调整大小。然后循环,因为你建议每次读取合理数量的数据。我通常选择MTU作为默认缓冲区大小。

获取它创建的底层byte []数组调用

memoryStreamInstance.GetBuffer() 

答案 1 :(得分:3)

将所有内容放在一起,假设您没有获得大量数据(超过内存容量):

TcpClient tcpclnt = new TcpClient();
tcpclnt.Connect(ip, port);
Stream stm = tcpclnt.GetStream();
stm.Write(cmdBuffer, 0, cmdBuffer.Length);
MemoryStream ms = new MemoryStream();
byte[] buffer = new Byte[2048];
int length;
while ((length = stm.Read(buffer, 0, buffer.Length)) > 0)
    ms.Write(buffer, 0, length);
tcpclnt.Close();
byte[] response = ms.ToArray();

如上所述,MemoryStream将为您处理动态字节数组分配。 Stream.Read(byte[], int, int)将返回此“读取”或0中找到的字节的长度,如果它已到达结尾。

答案 2 :(得分:3)

您是否尝试过StreamReader类?我不确定它是否适用于这种情况,但我过去曾使用StreamReader读取HttpWebResponse响应流。非常容易使用。

StreamReader reader = new StreamReader(stm);
String result = reader.ReadToEnd();

答案 3 :(得分:1)

int count;
while ( (count = stm.Read(buffer, 0, buffer.Length)) > 0 ) {
   // process buffer[0..count-1]
   // sample:
   // memoryStream.Write(buffer, 0, count);
}

答案 4 :(得分:0)

代码:

byte[] buffer = new byte[1024];
int amt = 0;
while((amt = stm.Read(buffer, 0, 1024) != 0)
{
   // do something
}

取决于你接收的内容,只是纯文本你可以将它存储在stringbuilder中,如果有大量的二进制数据,将它存储在sanya memorystream中

答案 5 :(得分:0)

我想这取决于您要对数据做什么?

如果你不需要一次只能在循环中执行读操作?