zy87_C#中基于流的try-catch-finally结构;利用委托进行文件处理的封装;using语句进行流的处理

1.基于流的try-catch-finally结构

1.1程序代码

string fileName = @"D:\filestream.data";
FileStream fileStream = null;
FileStream fileStream1 = null;
try
{
    FileInfo myFile = new FileInfo(fileName);
    fileStream = myFile.OpenWrite();
    byte[] datas = { 100, 101, 102, 103, 104, 105, 106, 107, 108, 109 };
    fileStream.Write(datas, 0, datas.Length);
    Console.WriteLine("文件已写入");
    fileStream.Close();
    fileStream1 = new FileStream(fileName, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);
    byte[] datas1 = new byte[fileStream1.Length];
    fileStream1.Read(datas1, 0, datas1.Length);
    Console.WriteLine("读取数据:");
    foreach (byte data1 in datas1)
    {
        Console.WriteLine(data1);
    }
}
catch(Exception ex)
{
    Console.WriteLine(ex.Message);
}
finally
{
    if (fileStream1 != null)
    {
        fileStream1.Close();
    }
    if (fileStream != null)
    {
        fileStream.Close();
    } 
}

2.利用委托进行文件处理的封装

2.1 程序代码

public delegate void MyfileProcessCode(FileStream file);

internal class Program
{
    static void Main(string[] args)
    {
        MyfileProcessCode cc = DoSomething;

        UniversalFileProcess(@"D:\filestream.data", cc);
    }
    public static void UniversalFileProcess(string path, MyfileProcessCode doSomething)
    {
        FileStream fileStream = new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite);
        try
        {
            doSomething(fileStream);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.ToString());
        }
        finally
        {
            if (fileStream != null)
            {
                fileStream.Close();
            }
        }
    }
    public static void DoSomething(FileStream fileStream)
    {
        byte[] datas = { 100, 101, 102, 103, 104, 105, 106, 107, 108, 109 };
        fileStream.Write(datas, 0, datas.Length);
        Console.WriteLine("文件已写入");
    }
}

2.2 代码解释

委托定义

public delegate void MyfileProcessCode(FileStream file);
  • 这行代码定义了一个名为MyfileProcessCode的委托,它指定了一个方法的签名,该方法接受一个FileStream类型的参数并返回void(即不返回任何值)。委托可以被视为类型安全的函数指针或回调函数。

Main 方法

static void Main(string[] args)
{
    MyfileProcessCode cc = DoSomething;
    UniversalFileProcess(@"D:\filestream.data", cc);
}
  • Main方法是程序的入口点。
  • 创建了一个MyfileProcessCode类型的委托实例cc,并将其初始化为指向DoSomething方法。这意味着cc现在代表了DoSomething方法。
  • 调用UniversalFileProcess方法,传入文件路径@"D:\filestream.data"和委托实例cc。这个方法将使用传入的文件路径和委托来执行文件处理操作。

UniversalFileProcess 方法

public static void UniversalFileProcess(string path, MyfileProcessCode doSomething)
{
    FileStream fileStream = new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite);
    try
    {
        doSomething(fileStream);
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.ToString());
    }
    finally
    {
        if (fileStream != null)
        {
            fileStream.Close();
        }
    }
}
  • UniversalFileProcess方法接受一个文件路径和一个MyfileProcessCode类型的委托作为参数。
  • 它首先尝试使用给定的路径、打开模式(OpenOrCreate)和访问模式(ReadWrite)创建一个FileStream实例。
  • try块中,它调用传入的委托doSomething,并将FileStream实例作为参数传递。这里,doSomething实际上是DoSomething方法,该方法将写入数据到文件中。
  • 如果在调用委托时发生异常,它会被catch块捕获,并打印异常信息到控制台。
  • 无论是否发生异常,finally块都会执行,确保FileStream被关闭。这是一种处理文件资源时的常见做法,以确保即使发生错误,文件也不会保持打开状态。

DoSomething 方法

public static void DoSomething(FileStream fileStream)
{
    byte[] datas = { 100, 101, 102, 103, 104, 105, 106, 107, 108, 109 };
    fileStream.Write(datas, 0, datas.Length);
    Console.WriteLine("文件已写入");
}
  • DoSomething方法符合MyfileProcessCode委托的签名,它接受一个FileStream实例作为参数。
  • 方法内部,它定义了一个字节数组datas,然后使用FileStreamWrite方法将这个数组写入文件。
  • 写入操作完成后,它打印一条消息到控制台,表明文件已被写入。
  • 注意:在DoSomething方法内部关闭FileStream是不必要的,也是不推荐的,因为这样做会在UniversalFileProcess方法的finally块中尝试再次关闭已经关闭的流时引发异常。实际上,应该在UniversalFileProcess方法的finally块中确保流被关闭,以确保资源的正确管理。在DoSomething方法中,你只需要关心你的业务逻辑(在这个例子中是写入数据到文件)。

3.using语句进行流的处理

3.1程序代码

static void Main(string[] args)
{
    using (FileStream fileStream = File.OpenWrite(@"D:\filestream.data"))
    {
        byte[] datas = { 100, 101, 102, 103, 104, 105, 106, 107, 108, 109 };
        fileStream.Write(datas, 0, datas.Length);
    }
}

3.2代码解释

using语句实际上是对try语句的封装;

等价于

{
	type obj = initialization;
    try
    {
        //具体处理代码
    }
    finally
    {
        if (obj!=null)
        {
            ((IDisposable)obj).Diespose
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值