3-5-3 读写缓存流 ——BufferedStream类
类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
}
}
} |
3-6 本章小结
n File是静态对象,提供对文件的创建、拷贝、移动和删除等一系列操作。
n File.Create(文件名)可以创建新的文件,并结合FileStream对象来进行读写操作。
n FileStream 和BinaryReader、BinaryWriter对象结合起来可对二进制数据进行操作。
n在C#中指明文件名的时候,要使用转义字符“\\”。
n 内存流提供无法调整大小的数据流视图,而且只能向其写入。
n BufferedStream对象对缓冲区进行读写。
课 后 练 习
1、FileInfo类和File类的设计差别是什么?
2、文本文件操作和图像文件的操作在本质上有何差异?
3、在一个WinFORM窗体之中建立一个菜单,命名为“文件夹”,其子菜单包括“创建文件夹”,“删除文件夹”,“移动文件夹”,通过点击这三个文件夹分别实现在“C:\”下面相应的功能。
4、在本章课后练习3的基础上,再创建一个菜单,命名为“文件”,其子菜单包括“创建文本文件”,“删除文本文件”,分别创建和删除练习3文件夹中的相关文本文件。
5、模拟WINDOWS操作系统,完整开发一个文本文件编辑器软件。