文件IO

文 件 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()


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值