一个关于C# 中System.Stream的问题

下面的代码是从MSDN,Stream Read方法拷贝过来的

using System;
using System.IO;

public class Block
{
public static void Main()
{
Stream s = new MemoryStream();
for (int i = 0; i < 100; i++)
{
s.WriteByte((byte)i);
}
s.Position = 0;

// Now read s into a byte buffer.
byte[] bytes = new byte[s.Length];
int numBytesToRead = (int) s.Length;
int numBytesRead = 0;
while (numBytesToRead > 0)
{
// Read may return anything from 0 to 10.
int n = s.Read(bytes, numBytesRead, 10);
// The end of the file is reached.
if (n == 0)
{
break;
}
numBytesRead += n;
numBytesToRead -= n;
}
s.Close();
// numBytesToRead should be 0 now, and numBytesRead should
// equal 100.
Console.WriteLine("number of bytes read: {0:d}", numBytesRead);
}
}

我的问题是,如果把count改成一个不能被100整除的数字,程序就会在运行时出错,因为count的长度比最走余下的要读取的内容短。如果是这样的话,假如我们事先不知道要读入的内容长度,如果正确读取最后的内容呢(小于一个count的这部分)

谢谢大家了

必须知道要读入内容的大小,否则的话,只能像字符串一样,以一个特殊字符,如\0 ,做为读入的结束标记符。追问

但是在实际问题中,并不是总是知道要读入的内容大小呀,这种情况怎么办?谢谢

温馨提示:内容为网友见解,仅供参考
第1个回答  2011-12-05
请看这句:
int n = s.Read(bytes, numBytesRead, 10);

Stream.Read返回值是读取了多少字节,如果返回值为0,说明到头了。

你出错不是因为Stream.Read出错了,而是你定义的bytes太小了,超出了访问范围。
如果你定义
byte[] bytes = new byte[s.Length + 10];
然后你再把count改成95之类的,你就会发现不会报错了

如果你不知道将要读取的流长度是多少,记得一定定义一个足够大的数组来存数据追问

一样还是会有问题,我觉得问题不是buffer的大小,而是已经读到结尾但是程序还期待更多的读入,因为count的大小比余下的字节多...

追答

你的观点是错的。

其实这个很容易验证,参考以下代码
我读取了超过stream长度的数据,但仍然不会出错,只不过n为0而已

Stream s = new MemoryStream();
for (int i = 0; i < 5; i++)
{
s.WriteByte((byte)i);
}

s.Position = 0;

byte[] bytes = new byte[100];

int n = s.Read(bytes, 0, 10);
Console.WriteLine(n);
n = s.Read(bytes, 10, 10);
Console.WriteLine(n);

本回答被提问者采纳

C#中,关于流的几个疑惑,谢谢!
所谓的“流”,指的是Stream,也就是所谓的一个文件区。这个文件区中存储着的信息可以是在内存中,也可以是在硬盘中。流中的数据均以byte型数组去存储。BufferedStream不是有缓冲区,而是本身就是缓冲区,可以用它来暂时存储其它流中的内容,然后flush进入相应的流。至于StreamReader、StreamWriter、Binary...

C# System.IO.Stream 与byte[]的联系和区别?
Stream是一个抽象类 表示一切以“流”的方式读写数据操作的集合。Stream的读写操作通常是基于byte[]的 Read时输出到指定的byte[]中 write时往指定的byte[]参数写入 但是这不表示继承Stream类的具体实现 是非要由byte[]构成的 二者没有任何共同点 剩下的都是区别 ...

C#编程,用NetworkStream传输文件,如何解决数据丢失问题?请教!_百度知...
可以在协议中加一个校验码,如果不对的数据可以重新发送 这样成功率会大很多

关于C#中FileStream.Read()的问题。。如下代码。。
1、FileStream 继承自 Stream。Stream 表示“流”(这个概念在计算机中非常常见,题主可以自行搜索相关资料),本质上是一种字节序列。说穿了,计算机只认识0和1,那么这么丰富多彩的文本、音乐、视频,归根结底都是转换成字节存储在内存与硬盘中的。Stream 对象有一个属性 Length,表示这个流的长度;还有...

C#的有关”(是否缺少 using 指令或程序集引用?)的问题。
...using System.Text;using System.Windows.Forms;using System.IO; \/\/是System.IO不是System.StreamWriter namespace _4 { public partial class Form1 : Form ...

在C#中,怎么样用System.Text下的类输出中文
写操作:Stream log = new FileStream(@"c:\\a.txt", FileMode.Create);System.IO.StreamWriter sw = new StreamWriter(log, System.Text.Encoding.GetEncoding("GB2312"));sw.WriteLine("你好");sw.Flush();sw.Close();log.Close();读,仿照上面就可以了 ...

使用C# 的 NetworkStream 无法将数据写入传输连接: 由于系统缓冲区空间...
改配置文件,maxBufferSize,maxReceivedMessageSize可以设置缓冲区最大缓冲文件的大小

C#中怎么获得流
首先引用一个命名空间,using System.IO。然后可以通过FileStream类创建一个实例。其中还包括StreamRead和write,至于二进制文件可以用BinaryStream,你写写就知道了

C#里边这样的语句是啥意思?StreamReader
)是指定StreamReader所要读取的流,照这个看hwRes应该是一个HttpRequest对象,这个就是获取HTTP请求的响应流,System.Text.Encoding.GetEncoding(GB2312)是用于指定StreamReader读取文本时使用的编码。这里是用GB2312编码 整个语句的意思是:创建一个StreamReader,用GB2312编码读取hwRes的响应流。

关于C# TcpClient 连接 .NetWorkStream 传送数据. 第一次客户端与服务...
不可以,你可以监听那个端口发送的数据然后用连接成功的端口发啊

相似回答