C# .NET中StreamReader返回缓冲区长度而非实际流数据问题求助
问题原因及修复方案
你遇到的问题核心是错误使用了StreamReader.Read()的返回值:StreamReader.Read(char[] buffer, int index, int count)方法的返回值是本次读取到的字符数量(整数类型),而不是读取到的实际文本内容。你直接将这个整数拼接到json字符串中,自然会得到一串重复的数字(比如4096)。
修复方案
要正确读取流内容,需要先将字符读取到缓冲区,再把缓冲区里的有效字符(从0到实际读取长度)添加到字符串中。同时建议用StringBuilder代替直接字符串拼接,避免频繁创建字符串带来的性能损耗。
修正后的代码:
StringBuilder jsonBuilder = new StringBuilder(); context.Request.InputStream.Position = 0; using (StreamReader inputStream = new StreamReader(context.Request.InputStream)) { char[] buffer = new char[4096]; int readCount; // 直接通过Read的返回值判断是否还有内容可读 while ((readCount = inputStream.Read(buffer, 0, buffer.Length)) > 0) { // 将缓冲区中实际读取到的字符添加到StringBuilder jsonBuilder.Append(buffer, 0, readCount); System.Console.WriteLine(jsonBuilder.Length); } string json = jsonBuilder.ToString(); }
补充说明
- 用
StringBuilder处理字符串拼接是.NET中处理大量字符串拼接的标准做法,性能远优于直接+=操作 - 循环条件改为判断
readCount > 0,比Peek()更可靠,因为Peek()在某些流场景下可能无法准确判断是否还有剩余内容 - 必须使用
Append(buffer, 0, readCount)而不是直接Append(buffer),因为最后一次读取可能无法填满整个缓冲区,直接Append会包含缓冲区里的无效字符
内容的提问来源于stack exchange,提问作者KWallace
相关产品推荐
相关产品推荐

