文章目录
- 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
,然后使用FileStream
的Write
方法将这个数组写入文件。 - 写入操作完成后,它打印一条消息到控制台,表明文件已被写入。
- 注意:在
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}}
}