<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />3-5-3  读写缓存流 ——BufferedStream<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

BufferedStream 就是给另一流上的读写操作添加一个缓冲区。缓冲区是内存中的字节块,用于缓存数据,从而减少对操作系统的调用次数。因此,缓冲区可提高读取和写入性能。使用缓冲区可进行读取或写入,但不能同时进行这两种操作。 BufferedStream Read Write 方法自动维护缓冲区的读写过程。
BufferedStream 可写在某些类型的流周围。它提供从基础数据源或储存库读取字节以及将字节写入基础数据源或储存库的实现。使用 BinaryReader BinaryWriter 读取和写入其他数据类型。 BufferedStream 用于在不需要缓冲区时防止缓冲区降低输入和输出速度。如果您读取和写入的大小始终大于内部缓冲区的大小,那么 BufferedStream 可能甚至无法分配内部缓冲区。
BufferedStream 也在共享缓冲区中缓冲读取和写入。假设您几乎始终执行一系列读取或写入操作,而很少在读取和写入之间切换。类 BufferedStream 的构造函数有 2 种重载,如表 3 17 所示:
3-17 BufferedStream的常用构造函数

名称

说明

BufferedStream (Stream)

使用默认的缓冲区大小 4096 字节初始化 BufferedStream 类的新实例。

BufferedStream (Stream, Int32)

使用指定的缓冲区大小初始化 BufferedStream 类的新实例。

    3-5-4  BufferedStream类案例学习

1. <?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />案例学习:通过缓冲区交换数据

本案例您将学习到:如何通过使用缓存流的来读写文件。
实验步骤(1):

由图 3-15 所示,从工具箱之中拖拽一个 GroupBox text 属性设置为“打开文件”;拖拽二个 Label 控件到 GroupBox 上, text 属性分别设置为“请选择源文件名:”、“请填写备份文件名:”;拖拽二个 TextBox 控件到 GroupBox 上,其中第一 TextBox 控件的 Enabled 属性为 false ;拖拽二个 Button 控件到 GroupBox 上, text 属性分别设置为“打开文件”、“备份文件”。

3-15  通过缓冲区交换数据界面图
实验步骤(2):

用鼠标双击所有 Button 控件,进入 .cs 文件编辑状态准备进行开发。代码加下:
using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using System.IO;

 

namespace FileOptionApplication

{

    public partial class Form16 : Form

    {

        public Form16()

        {

            InitializeComponent();

        }

        /// <summary>

        /// 打开原始文件

        /// </summary>

        private void button1_Click(object sender, EventArgs e)

        {

            OpenFileDialog openfile = new OpenFileDialog();

            openfile.Filter = "文本文件(*.txt)|*.txt";

            if (openfile.ShowDialog() == DialogResult.OK)

            {

                textBox1.Text = openfile.FileName.ToString();

            }

        }

        /// <summary>

        /// 备份目标文件;Stream 和 BufferedStream 的实例

        /// </summary>

        private void button2_Click(object sender, EventArgs e)

        {

            string targetpath = @"c:\" + textBox2.Text + ".txt";

            FileStream fs =File.Create(targetpath);

            fs.Dispose();

            fs.Close();

            string sourcepath = textBox1.Text;

            Stream outputStream= File.OpenWrite(targetpath);

            Stream inputStream = File.OpenRead(sourcepath);

            BufferedStream bufferedInput = new BufferedStream(inputStream);

            BufferedStream bufferedOutput = new BufferedStream(outputStream);

            byte[] buffer = new Byte[4096];

            int bytesRead;

            while ((bytesRead =bufferedInput.Read(buffer, 0,4096)) > 0)

            {

                bufferedOutput.Write(buffer, 0, bytesRead);

            }

            //通过缓冲区进行读写

            MessageBox.Show("给定备份的文件已创建", "提示");

            bufferedOutput.Flush();

            bufferedInput.Close();

            bufferedOutput.Close();

            //刷新并关闭 BufferStream

        }

    }

}

3-6  本章小结

File 是静态对象,提供对文件的创建、拷贝、移动和删除等一系列操作。

File.Create( 文件名)可以创建新的文件,并结合FileStream对象来进行读写操作。

FileStream BinaryReaderBinaryWriter对象结合起来可对二进制数据进行操作。

n C#中指明文件名的时候,要使用转义字符“\\”

内存流提供无法调整大小的数据流视图,而且只能向其写入。

BufferedStream 对象对缓冲区进行读写。

 

 

课 后 练 习

1 FileInfo 类和File类的设计差别是什么?

2 、文本文件操作和图像文件的操作在本质上有何差异?

3 、在一个WinFORM窗体之中建立一个菜单,命名为“文件夹”,其子菜单包括“创建文件夹”,“删除文件夹”,“移动文件夹”,通过点击这三个文件夹分别实现在“C:\”下面相应的功能。

4 、在本章课后练习 3 的基础上,再创建一个菜单, 命名为“文件”,其子菜单包括“创建文本文件”,“删除文本文件”,分别创建和删除 练习 3 文件夹中的相关文本文件。

5 、模拟 WINDOWS 操作系统,完整开发一个文本文件编辑器软件。