"流本身就是一点一点读到内存中的,并不是一次读出,所以不存在占用内存的问题,主要看你的buffer的大小,这部分会保存在内存中。"

解决方案 »

  1.   

    应该不对的。
    按照这么说,不是用不着考虑流的读取,读取多少啦?只要设定buffer就可以了嘛。
    流的读取受到buffer的限制,但是读取多少也是可以控制的。
    如果你的buffer设置很大,那么仍然存在占用内存问题。
    关于占用内存问题,从设计上来讲,达到资源占用和速度合理结合,才是占用内存问题所追求的方向。
      

  2.   

    当然是对的,
    比如buffer是10,那就只占10的内存
    单位是多少,具体而定哈,这只是一个举例,
      

  3.   

    buffer的长度是怎么设定的?通过Read方法的参数来设置的吗?那这样的话,如果不用循环读取,怎么得到流文件的所有数据?如下贴,有人回复说不用这样读取?
    http://community.csdn.net/Expert/topic/4332/4332404.xml?temp=.3219416
      

  4.   

    对的,不占用内存指的就是流在内存中最大容量也就Buffer那么大。
      

  5.   

    Buffer是在内存中开辟的一块内存区域,是一块变长分配或是定长分配的内存块。出与对程序访问的优化及减少内存碎片的考虑,在未指定初始大小或是初始化为零的Buffer初始化过程中它将被默认的分配一片区域,并且根据需要动态的增减。因此它本身是要占用内存的,而这个大小根据初始化大小而定,所以“不存在占用内存的问题”这话是不对的。“流本身并不是一点一点读到内存中,并不是一次读出”,这话也有问题。因为正常的Buffer分配原则,是如果有足够的可分配内存空间,那么流是会被一次性读入的内存中的。这种考虑主要是因为硬件间的速度的差异性而采取的一种优化措施。如果流的本身超出可分配内存空间的大小,则会根据实际情况动态的读取数据,并将不用的流数据置换出内存,从而达到最佳的运行效率。
      

  6.   

    刚才看到原先的贴,发现你的这段代码中存在问题。原代码:
    try
    {
       m_fileStream = new FileStream(p_strSource, FileMode.Open, FileAccess.Read, FileShare.Read);
       long m_lngLength = m_fileStream.Length;
       byte[] buf = new byte[m_intBufLength];
       long m_lngReadLength = 0;
       while (m_lngReadLength < m_lngLength)//减少内存的使用量
      {
         int m_intRetLength = m_fileStream.Read(buf, (int)m_intBufLength, m_intBufLength);
         HttpContext.Current.Response.OutputStream.Write(buf, 0, m_intRetLength);
         m_lngReadLength += m_intRetLength;
      }
    }
      finally//资源释放
      {
    if(m_fileStream != null)
    {
    m_fileStream.Close();
      }
    }
    在程序中,m_fileStream.Read()的原型函数为:
    public override int Read (
    [InAttribute] [OutAttribute] byte[] array,
    int offset,
    int count
    )
    第二个参数为当前流的偏移量,也就是读取数据的起始位置,你的程序中这个位置始终为m_intBufLength这个变量,而纵观整个程序段,m_intBufLength这个变始始终为定值,因此程序无法正常读取流数据。因此应改为m_lngReadLength这个变量,才有可能实现功能。你所说的Buffer只是字节型数组,因此并不是真正意义上的Buffer。所以,想控制Buffer的大小,只要改变数组的大小就可以了。
      

  7.   

    对于任何一个计算机系统来说,内存资源总是有限的。32位机可以寻址4GB空间,但是我们所使用的数据库文件就有超过4GB的文件存储量,如果全读进内存是不可能的。
    现在要分清的是文件流、内存流与Buffer的区别。
    文件流本身是一个优化过的数据读取器,根据数据读取优化的原则,文件流存在本身可以带有一定数量的Buffer,但这个Buffer对程序员是透明的。
    内存流是一个读取器与Buffer混合体,它是完全存在于内存中的,因此必然占用内存。
    而Buffer仅仅只是内存空间,是一个被动的数据载体。
      

  8.   

    guyufeng(guyufeng) :谢谢你的热心参与,那段代码是有问题.但是你对m_fileStream.Read()的原型函数中的参数理解不正确(跟我原来的理解出现一样的错误了).也是yeerh提醒的我,我再去查MSDN才看明白过来.原形说明是这样的:
    array 
    当此方法返回时,包含指定的数组,数组中 offset 和 (offset + count - 1) 之间的值被从当前源中读取的字节替换。 
    offset 
    array 中的字节偏移量,从此处开始读取。 (注意:这里是Array,而不是流的当前位置)
    count 
    最多读取的字节数。 
    那段代码只需把下面这句修改一下就能正确执行了.
     int m_intRetLength = m_fileStream.Read(buf, (int)m_intBufLength, m_intBufLength);
    的(int)m_intBufLength改成0就行了.从你上面的回复可以总结出一点,对于FileStream我们是不是就不需要像我那样的写法.分步读取