一个关于C# 中System.Stream的问题
下面的代码是从MSDN,StreamRead方法拷贝过来的usingSystem;usingSystem.IO;publicclassBlock{publicstatic...
下面的代码是从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的这部分)
谢谢大家了 展开
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的这部分)
谢谢大家了 展开
2个回答
展开全部
请看这句:
int n = s.Read(bytes, numBytesRead, 10);
Stream.Read返回值是读取了多少字节,如果返回值为0,说明到头了。
你出错不是因为Stream.Read出错了,而是你定义的bytes太小了,超出了访问范围。
如果你定义
byte[] bytes = new byte[s.Length + 10];
然后你再把count改成95之类的,你就会发现不会报错了
如果你不知道将要读取的流长度是多少,记得一定定义一个足够大的数组来存数据
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);
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询