文件及数据流技术(五)

来源:互联网 发布:淘宝直播抽奖狂点屏幕 编辑:程序博客网 时间:2024/04/28 08:25

原文来源:《C#从入门到精通》

数据流提供了一种向后备存储写入字节和从后备存储读取字节的方式,它是在.NET Framework中执行读写文件操作时一种非常重要的介质。

流操作类介绍

.NET Framework使用流来支持读取和写入文件,开发人员可以将流视为一组连续的一维数据,包含开头和结尾,并且其中的游标指示了流中的当前位置。

1、流操作

流中包含的数据可能来自内存、文件或TCP/IP套接字。流包含以下几种可应用于自身的基本操作。

1、读取:将数据从流传输到数据结构(如字符串或字节数组)中。
2、写入:将数据从数据源传输到流中。
3、查找:查询和修改在流中的位置。

2、流的类型

在.NET Framework中,流由Stream类来表示,该类构成了所有其他流的抽象类。不能直接创建Stream类的实例,但是必须使用它实现其中的一个类。

C#中有许多类型的流,但在处理文件输入/输出(I/O)时,最重要的类型为FileStream类,它提供读取和写入文件的方式。在处理文件I/O时使用的其他流主要包括:

1、BufferedStream
2、CryptoStream
3、MemoryStream
4、NetworkStream

文件流类

FileStream类公开以文件为主的Stream,它表示在磁盘或网络路径上指向文件的流。一个FileStream类的实例实际上代表一个磁盘文件,它通过Seek方法进行对文件的随机访问,也同时包含了流的标准输入、标准输出、标准错误等。FileStream默认对文件的打开方式是同步的,但它同样很好地支持异步操作。

对文件流的操作,实际上可以将文件看作是电视信号发送塔要发送的一个电视节目(文件),将电视节目转换成模拟数字信号(文件的二进制流),按指定的发送序列发送到指定的接收地点(文件的接收地址)。

文本文件的写入与读取

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.IO;namespace StreamReadWrite{    class Program    {        static void Main(string[] args)        {            // Get the directories currently on the C drive.            DirectoryInfo[] cDirs = new DirectoryInfo(@"c:\").GetDirectories();            // Write each directory name to a file.            using (StreamWriter sw = new StreamWriter("CDriveDirs.txt",true))            {                foreach (DirectoryInfo dir in cDirs)                {                    sw.WriteLine(dir.Name);                }            }            // Read and show each line from the file.            string line = "";            using (StreamReader sr = new StreamReader("CDriveDirs.txt"))            {                while ((line = sr.ReadLine()) != null)                {                    Console.WriteLine(line);                }            }        }    }}

二进制文件的写入与读取

public partial class Form1 : Form{    public Form1()    {        InitializeComponent();    }    private void button1_Click(object sender, EventArgs e)    {        if (textBox1.Text == string.Empty)        {            MessageBox.Show("要写入的文件内容不能为空");        }        else        {            //设置保存文件的格式            saveFileDialog1.Filter = "二进制文件(*.dat)|*.dat";            if (saveFileDialog1.ShowDialog() == DialogResult.OK)            {                //使用“另存为”对话框中输入的文件名实例化FileStream对象                FileStream myStream = new FileStream(saveFileDialog1.FileName, FileMode.OpenOrCreate, FileAccess.ReadWrite);                //使用FileStream对象实例化BinaryWriter二进制写入流对象                BinaryWriter myWriter = new BinaryWriter(myStream);                //以二进制方式向创建的文件中写入内容                myWriter.Write(textBox1.Text);                //关闭当前二进制写入流                myWriter.Close();                //关闭当前文件流                myStream.Close();                textBox1.Text = string.Empty;            }        }    }    private void button2_Click(object sender, EventArgs e)    {        //设置打开文件的格式        openFileDialog1.Filter = "二进制文件(*.dat)|*.dat";        if (openFileDialog1.ShowDialog() == DialogResult.OK)        {            textBox1.Text = string.Empty;            //使用“打开”对话框中选择的文件名实例化FileStream对象            FileStream myStream = new FileStream(openFileDialog1.FileName, FileMode.Open, FileAccess.Read);            //使用FileStream对象实例化BinaryReader二进制写入流对象            BinaryReader myReader = new BinaryReader(myStream);            if (myReader.PeekChar() != -1)            {                //以二进制方式读取文件中的内容                textBox1.Text = Convert.ToString(myReader.ReadString());            }            //关闭当前二进制读取流            myReader.Close();            //关闭当前文件流            myStream.Close();        }    }}