C#认识、理解和运用 BufferedStream

来源:互联网 发布:噪音监测软件 编辑:程序博客网 时间:2024/06/07 11:15

转自http://blog.csdn.net/hanfon/article/details/7284315

C#认识、理解和运用 BufferedStream

 
BufferedStream类,可在另一流上添加并读取一个缓冲区,继承Stream抽象类。
缓冲区是内存中的字节块,用于缓存数据,从而减少对操作系统的调用次数(处理大文件速度快)。
缓冲区可提高读取和写入性能,使用缓冲区可进行读取或写入操作,但不能同时进行这两种操作。

//1.需要用BufferedStream,需要先创建一个Stream流对象。
//注:OpenWrite打开准备写入文件 OpenReader(对应Write方法) 打开准备读取文件(对应Reader方法)
//2.创建好流对象后,将这些对象作为参数传递给BufferedStream类的构造函数,创建BufferedStream实例
//3.创建了BufferedStream对象后,可以用该对象调用Read()和Write()方法,实现数据的读写
//Write 方法:将字节复制到缓冲流,并将缓冲流内的当前位置前进写入的字节数。
//Read 方法:将字节从当前缓冲流复制到数组。
//Seek 方法:设置当前缓冲流中的位置。
//4.最后一定要清空缓冲区,以确保数据全部写入文件。
 
 
完整代码:
<!--Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->static void Main(string[] args) { Console.WriteLine("-------开始工作-------"); //UserBufferStreamWrite(); UserBufferStreamRead(); Console.WriteLine("-------开始结束-------"); Console.ReadKey(); } private static void UserBufferStreamRead() { Stream instream = File.OpenRead(@"E:/20120214.txt"); BufferedStream bfs = new BufferedStream(instream); byte[] buffer = new byte[1024]; while (bfs.Read(buffer, 0, buffer.Length)>0) { Console.WriteLine(Encoding.GetEncoding("UTF-8").GetString(buffer)); } bfs.Flush(); bfs.Close(); instream.Close(); } private static void UserBufferStreamWrite() { Stream instream = File.OpenWrite(@"E:/20120214.txt"); BufferedStream bfs = new BufferedStream(instream); for (int i = 0; i < 10; i++) { byte[] buff = new UTF8Encoding().GetBytes(DateTime.Now.ToLongTimeString() + "\r\n"); bfs.Write(buff, 0, buff.Length); System.Threading.Thread.Sleep(500); } bfs.Flush(); bfs.Close(); instream.Close(); }
 
 
 
 
 
类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. 案例学习:通过缓冲区交换数据

本案例您将学习到:如何通过使用缓存流的来读写文件。
u 实验步骤(1):
由图3-15所示,从工具箱之中拖拽一个GroupBox,text属性设置为“打开文件”;拖拽二个Label控件到GroupBox上,text属性分别设置为“请选择源文件名:”、“请填写备份文件名:”;拖拽二个TextBox控件到GroupBox上,其中第一TextBox控件的Enabled属性为false;拖拽二个Button控件到GroupBox上,text属性分别设置为“打开文件”、“备份文件”。
图3-15  通过缓冲区交换数据界面图
u 实验步骤(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
        }
    }
}
0 0