文 件 I O 文件IO 文件IO
1.写文件 FileStream
数据写入文件,以及读取文件
基础工具:
FileStream :文件流
辅助工具:
BinaryReader / BinaryWriter:二进制数据读写
StreamReader / StreamWriter :文本数据按行读写
写文件
写文件时,创建一个可写入的FileStream演示:
1打开文件流
2写入数据
3关闭文件流
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Major;
namespace CSharp基础语法
{
class Program
{
public static void TestWrite()
{
// 创建目录
FileInfo fi = new FileInfo("data");
// 1.打开文件流(写方式)
FileStream stream = fi.OpenWrite();
// 2.写入数据
byte[] data = { 1, 2, 3, 4, 0xA0, 0xB1 };
stream.Write(data, 0, 6);
// 3.关闭文件流
stream.Close();
}
static void Main(string[] args)
{
TestWrite();
}
}
}
如果所在目录不存在,则抛出异常。所以,要确保目录是存在的。
fi.Directory.Create();
2.读文件
读文件时,创建一个只读的FileStream演示:
1 打开文件流(读方式)
2 读取数据
3 关闭文件流
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Major;
namespace CSharp基础语法
{
class Program
{
public static void TestRead()
{
// 创建目录
FileInfo fi = new FileInfo("data");
// 1.打开文件流(写方式)
FileStream stream = fi.OpenRead();
// 2.写入数据
byte[] buffer =new byte[4000];
int n = stream.Read(buffer, 0, buffer.Length);
Console.WriteLine("Got Bytes: " + n);
// 3.关闭文件流
stream.Close();
}
static void Main(string[] args)
{
TestRead();
}
}
}
读取时,缓存区应足够大
byte[] buffer = new byte[4000];
int n = stream.Read(buffer, O, buffer.Length);
返回值n,表示实际读取到的字节数
提示:可以根据文件的实际长度,来创建一个刚好够大的缓存区
无论是读、还是写,都用的是FileStream在打开的时候,已经指定了读写方式
fi.OpenWrite()写方式
fi.OpenRead()读方式
3.文件句柄的关闭
文件句柄的关闭
打开文件流后,每个FileStream对应一个句柄
在用完之后,要确保句柄被关闭:
如果一个FileStream未被Close(),则称句柄泄露
如何确保文件句柄被关闭呢?
两种写法:
1使用try… finally …,在finally中关闭
2使用using (…){},自动关闭
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Major;
namespace CSharp基础语法
{
class Program
{
public static void TestRead()
{
// 创建目录
FileInfo fi = new FileInfo("data");
// 1.打开文件流(写方式)
FileStream stream = fi.OpenRead();
// 2.写入数据
try
{
byte[] buffer = new byte[4000];
int n = stream.Read(buffer, 0, buffer.Length);
Console.WriteLine("Got Bytes: " + n);
}
finally
{
stream.Close();
}
}
static void Main(string[] args)
{
TestRead();
}
}
}
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Major;
namespace CSharp基础语法
{
class Program
{
public static void TestRead()
{
FileInfo fi = new FileInfo("data");
using (FileStream stream = fi.OpenRead())
{
byte[] buffer = new byte[4000];
int n = stream.Read(buffer, 0, buffer.Length);
Console.WriteLine("Got Bytes: " + n);
}
}
static void Main(string[] args)
{
TestRead();
}
}
}
4.托管与非托管
托管的 Managed ,由框架自动管理的
非托管的Unmanaged ,由我们手工管理的
托管Managed,就是托付给它来管理比如,
Student stu = new Student();
在C#里,只管创建对象,不管销毁对象
此对象由平台框架(CLR)托管,当失去引用时,会触发GC过程自动回收。
CLR : Common Language Runtime公共语言运行时
相当于Java语言里的JVM
非托管资源Unmanaged Resource指的是不由CLR回收销毁的资源
常见的有:文件句柄、窗口句柄或网络连接在代码中,需要显式地调用Dispose()方法来销毁
例如,fileStream.Dispose()