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

server/2024/10/4 6:51:49/

文章目录

  • 1.基于流的try-catch-finally结构
    • 1.1程序代码
  • 2.利用委托进行文件处理的封装
    • 2.1 程序代码
    • 2.2 代码解释
      • 委托定义
      • Main 方法
      • UniversalFileProcess 方法
      • DoSomething 方法
  • 3.using语句进行流的处理
    • 3.1程序代码
    • 3.2代码解释

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}}
}

http://www.ppmy.cn/server/126810.html

相关文章

远程分支与本地分支上传内容

title: 远程分支与本地分支上传内容 date: 2024-09-29 16:25:15 tags: git 1.创建远程分支 2.在本地查看远程分支 git remote show origin 3.将远程分支拉到本地 git fetch origin4.创建本地分支 这个分支是基于远程分支创建的,分支名可以和远程分支名一样 gi…

Pikachu-Sql-Inject -基于boolian的盲注

基于boolean的盲注: 1、没有报错信息显示; 2、不管是正确的输入,还是错误的输入,都只显示两种情况,true or false; 3、在正确的输入下,输入and 1 1/and 1 2发现可以判断; 布尔盲注常用函数&…

数据结构:并查集

数据结构:并查集 并查集原理实现框架初始化合并查询获取成员路径压缩其它 总代码 并查集 在生活中,经常会出现分组问题。比如一个班级分为多个小组,打篮球分为两方等等。在同一个组中的所有成员,就构成一个集合。对这种一个群体分…

pytorch中的TensorDataset和DataLoader

TensorDataset 详解 TensorDataset 主要用于将多个 Tensor 组合在一起,方便对数据进行统一处理。它可以用于简单地将特征和标签配对,也可以将多个特征张量组合在一起。 1. 将特征和标签组合 假设我们有一组图像数据(特征)和对应…

Unity初识+面板介绍

Unity版本使用 小版本号高,出现bug可能性更小;一台电脑可以安装多个版本的Unity,但是需要安装在不同路径;安装Unity时不能有中文路径;Unity项目路径也不要有中文。 Scene面板 相当于拍电影的片场,Unity程…

开发微信小程序 基础03

WXSS(类似CSS) 定义: WXSS (WeiXin Style Sheets)是一套样式语言,用于描述 WXML的组件样式,类似于网页开发中的 CSS。 分类: 全局样式:定义在 app.wxss 中的样式为全局样式,作用于每一个页面 局部样式&…

Linux——环境变量

文章目录 1.什么是环境变量2.常见环境变量3. 如何查看环境变量4. 测试PATH5.测试HOME6. 和环境变量有关的指令7.环境变量的组织方式8. 通过代码获取环境变量main函数的第3个参数 9. 环境变量具有全局属性 当我们在Linux操作系统进行操作时,我们会发现使用系统命令的…

Prompt:在AI时代,提问比答案更有价值

你好,我是三桥君 随着AI技术的飞速发展,我们进入了一个信息爆炸的时代。在这个时代,只要你会提问,AI就能为你提供满意的答案。这种现象让很多人开始思考:在这个答案触手可及的时代,答案的价值是否还像以前…