内存数据流


        内存数据流,就是利用内存作为数据的存储区,此时可把这块内存区当作是文件。

        它同样派生于Stream类,也具有Read与Write的方法。

 

        MemoryStream类的构造方法几个

        可以根据指定大小创建一个内存区域(流),例子用此方法

        也可以根据缓冲数据创建一个内存区域(流)

        Public Sub New ( buffer As Byte(), index As Integer, count As Integer, writable As Boolean )


       下面是内存流与文件流的区别(下面文件流标错,应该是文件,其上下箭头才是文件流)

        通常两个的联系是通过一个数组(缓冲)这个搬运工来联系。

          

MemoryStream 读取文件_MemoryStream 读取文件



       对于一块内存块,有两个有用的成员:

                         ToArray   把内存块的数据转化成一个数组

                         WriteTo    把数据(字节或数组)写入到内存块中。


      下例:用文件流与内存流操作文件。

       利用文件流来填充数组btAll,然后取数组部分数据填充内存块(内存流写),最后直接把内存块转为数组来显示。

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        Dim btArray(3) As Byte
        Dim btAll As Byte()  '装载整个文件字节
        Dim ms As New MemoryStream(4)
        Dim fs As New FileStream("D:\11.txt", FileMode.Open, FileAccess.Read)

        ReDim btAll(fs.Length)
        fs.Read(btAll, 0, fs.Length)
        ms.Write(btAll, 5, 4) '相当把文件中第5位置起4个字节写入内存

        btArray = ms.ToArray '把内存转存到数组中
        TextBox2.Text = Encoding.ASCII.GetString(btArray)

        ms.Close()
        fs.Close()
    End Sub



          

MemoryStream 读取文件_WriteTo_02







缓冲数据流



一、为什么要缓冲数据流(内存数据流)

        文件流它的数据源或目的地都是文件,它们都涉及到文件的打开与关闭等操作。


        但是,对于一些特殊的I/O来说,并不适合。比如,数据打印操作,程序将数据放到打印队列中等待打印,

        此时缓冲区就被作为了数据源,它取代一般的数据存储装置(比如文件),是缓冲区进行了数据的存取。

        显然这时用文件流来操作是不适合的。


        在网络传输中,缓冲数据流也起到很好的作用。



二、什么是缓冲数据流?

        缓冲区是内存中的一块保留区域,专门用以存储应用程序执行所产生的暂存数据。

        比如前面文件流中缓冲数据,也充当着缓冲的功能,也叫缓冲数组。


        利用缓冲区进行数据读写,可以大提升数据存取交通,并且同时减少打开、关闭文件所耗用的资源。


        .Net对于缓冲区数据的存取操作,由BufferedStream类完成。

          BufferedStream类派生于Stream类,其数据读写方法与FileStream类似。



三、缓冲数据流的构造与方法

        BufferedStream类以另一个数据流对象作为初始化底层数据流来源,如:

                   Public  Sub  New ( ByVal  stream as Stream)


        也可以是下面构造:

                   Public   Sub  New ( ByVal  stream As Stream,  ByVal  bufferSize  As Integer)


       上面对象一旦建立后,便 可利用内存缓冲区存取底层数据,因此不需要针对stream连接的设备进行操作。


       上面两个构造函数,都将使用预设的缓冲区大小,第一个默认是4096字节,第二个是自定义。



       BufferedStream与FileStream一样,提供相同的数据读写方法。

       但要注意:  不能同时对BufferedStream流进行读和写;