• C# I/O流: FileStream


    目录

    一.FileStream

    二.Flush, Close , Dispose,using

    三.枚举 SeekOrigin

    四.FileStream 的创建

    五.FileStream 的属性

    六.FileStream 的方法:

    1.异步写

    2.同步写

    3.异步读

    4.同步读

    5.Seek

    6.SetLength

    7.其他


    一.FileStream

    FileStream 类主要用于文件的读写不仅能读写普通的文本文件,还可以读取图像文件、声音文件等不同格式的文件

    二.Flush, Close , Dispose,using

    Flush(), Close() , Dispose() ,using(){}
    看这四个区别之前 首先得知道 文件缓冲区

    从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘上。
    如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区,然后再从缓冲区逐个地将数据送到程序数据区。
    缓冲区是为了提升读写的速度

    1.Flush()就是清除缓冲区 并把缓冲区的内容写入文件
    2.Close()是

    1. public virtual void Close()
    2. {
    3. this.Dispose(true);
    4. GC.SuppressFinalize(this);
    5. }

    3.Dispose() 是

    1. public void Dispose()
    2. {
    3. this.Close();
    4. }

    4.using(){} 结束会自动调用 Dispose()

    三.枚举 SeekOrigin

    Begin         0     
    指定流的开始位置。

    Current     1     
    指定流中的当前位置。

    End         2     
    指定流的结束位置。

    四.FileStream 的创建

    1.FileStream创建
            FileStream file = new FileStream(path, FileMode.Create);

    2.File创建
            FileStream file1 = File.Create(path);
            FileStream file2 = File.Open(path, FileMode.Create);
            FileStream file3 = File.OpenRead(path);
            FileStream file4 = File.OpenWrite(path);

    3.Fileinfo创建
            FileInfo fileInfo = new FileInfo(path);
            FileStream file5 = fileInfo.Create();
            FileStream file6 = fileInfo.Open(FileMode.Create);
            FileStream file7 = fileInfo.OpenRead();
            FileStream file8 = fileInfo.OpenWrite();

    五.FileStream 的属性

    CanRead     
    获取一个值,该值指示当前流是否支持读取。

    FileStream file = new FileStream(string path, FileMode mode, FileAccess access)
    当 access == FileAccess.Write 或者流关闭 时 CanRead = false;
    当 access == FileAccess.Read || access == FileAccess.ReadWrite 时 CanRead = true;

    CanWrite     
    获取一个值,该值指示当前流是否支持写入。

    FileStream file = new FileStream(string path, FileMode mode, FileAccess access)
    当 access == FileAccess.Write || access == FileAccess.ReadWrite 时 CanWrite = true;
    当 access == FileAccess.Read 或者流关闭 时 CanRead = false;

    CanSeek     
    获取一个值,该值指示当前流是否支持查找。

    流关闭 时 CanSeek = false;

    IsAsync     
    获取一个值,它指示 FileStream 是异步打开还是同步打开的。

    Length     
    获取流的长度(以字节为单位)。

    Name     
    获取 FileStream 中已打开的文件的绝对路径。

    Position
    获取或设置此流的当前位置。

    和Seek()类似
    区别是:
    1.获取
            Position获取的是当前流的结束位置
            Seek()获取的是此次开始读取的位置

    2.设置
            Seek()可以不用知道流长度下设置位置

    例如:

    1. public void Seek() {
    2. using(file = new FileStream(path, FileMode.OpenOrCreate)) {
    3. byte[] array = new byte[4];
    4. file.Read(array, 0, 4);
    5. string str1 = System.Text.Encoding.Default.GetString(array);
    6. Console.WriteLine($"先读两个:{str1} 流的位置 :{file.Position}");
    7. long seekLength = file.Seek(4, SeekOrigin.Current);
    8. byte[] array1 = new byte[1024];
    9. file.Read(array1, 0, 1024);
    10. string str = System.Text.Encoding.Default.GetString(array1);
    11. Console.WriteLine($"用SeekOrigin.Current 4 :{str} 流的位置 :{file.Position} seekLength:{seekLength}");
    12. file.Flush();
    13. }
    14. }

    打印:

    空格是
    byte[] array1 = new byte[1024];这句代码的原因

    SafeFileHandle     
    获取 SafeFileHandle 对象,它代表当前 FileStream 对象所封装的文件的操作系统文件句柄。

    六.FileStream 的方法:

    1.异步写

    BeginWrite(Byte[], Int32, Int32, AsyncCallback, Object)     
    开始异步写操作。 请考虑改用 WriteAsync(Byte[], Int32, Int32, CancellationToken)。
    WriteAsync(Byte[], Int32, Int32, CancellationToken)     
    将字节的序列异步写入当前流,将该流中的当前位置向前移动写入的字节数,并监视取消请求。
    EndWrite(IAsyncResult)     
    结束异步写入操作,在 I/O 操作完成之前一直阻止。 (请考虑改用 WriteAsync(Byte[], Int32, Int32, CancellationToken)。)

    1. public async void AsyncWrite() {
    2. using(file = new FileStream(path, FileMode.OpenOrCreate)) {
    3. string str = "当前流是否支持读取";
    4. byte[] array = System.Text.Encoding.Default.GetBytes(str);
    5. await file.WriteAsync(array, 0, array.Length);
    6. Console.WriteLine($"获取或设置此流的当前位置Write2:{file.Position}");
    7. file.Flush();
    8. }
    9. }

    打印:


    2.同步写

    Write(Byte[], Int32, Int32)     
    将字节块写入文件流。
    WriteByte(Byte)     
    一个字节写入文件流中的当前位置。

    1. public void Write() {
    2. using(file = new FileStream(path, FileMode.OpenOrCreate)) {
    3. string str = "当前流是否支持查找";
    4. byte[] array = System.Text.Encoding.Default.GetBytes(str);
    5. file.Write(array, 0, array.Length);
    6. Console.WriteLine($"获取或设置此流的当前位置Write1:{file.Position}");
    7. file.Flush();
    8. }
    9. }

    打印:

    3.异步读

    BeginRead(Byte[], Int32, Int32, AsyncCallback, Object)     
    开始异步读操作。 请考虑改用 ReadAsync(Byte[], Int32, Int32, CancellationToken)。
    EndRead(IAsyncResult)     
    等待挂起的异步读操作完成。 (请考虑改用 ReadAsync(Byte[], Int32, Int32, CancellationToken)。)
    ReadAsync(Byte[], Int32, Int32, CancellationToken)     
    从当前文件流异步读取字节的序列,将其写入从指定偏移量开始的字节数组,按读取的字节数向前移动文件流中的位置,并监视取消请求。
     

    1. public async void AsyncRead() {
    2. using(file = new FileStream(path, FileMode.OpenOrCreate)) {
    3. byte[] array = new byte[1024];
    4. await file.ReadAsync(array, 0, 1024);
    5. string str = System.Text.Encoding.Default.GetString(array);
    6. Console.WriteLine(str);
    7. file.Flush();
    8. }
    9. }

    打印:

    4.同步读

    Read(Byte[], Int32, Int32)     
    从流中读取字节块并将该数据写入给定缓冲区中。
    ReadByte()     
    从文件中读取一个字节,并将读取位置提升一个字节。

    1. public void Read() {
    2. using(file = new FileStream(path, FileMode.OpenOrCreate)) {
    3. byte[] array = new byte[1024];
    4. int length = file.Read(array, 0, 1024);
    5. string str = System.Text.Encoding.Default.GetString(array);
    6. Console.WriteLine(str);
    7. file.Flush();
    8. }
    9. }

    打印:

    5.Seek

    Seek(Int64, SeekOrigin)     
    将该流的当前位置设置为给定值。
    1.SeekOrigin.Begin

    1. public void Seek() {
    2. using(file = new FileStream(path, FileMode.OpenOrCreate)) {
    3. long seekLength = file.Seek(8, SeekOrigin.Begin);
    4. byte[] array = new byte[1024];
    5. file.Read(array, 0, 1024);
    6. string str = System.Text.Encoding.Default.GetString(array);
    7. Console.WriteLine(str);
    8. file.Flush();
    9. }
    10. }

    打印:


    2.SeekOrigin.End

    1. public void Seek() {
    2. using(file = new FileStream(path, FileMode.OpenOrCreate)) {
    3. long seekLength = file.Seek(-8, SeekOrigin.End);
    4. byte[] array = new byte[1024];
    5. file.Read(array, 0, 1024);
    6. string str = System.Text.Encoding.Default.GetString(array);
    7. Console.WriteLine(str);
    8. file.Flush();
    9. }
    10. }

    打印:


    3.SeekOrigin.Current

    1. public void Seek() {
    2. using(file = new FileStream(path, FileMode.OpenOrCreate)) {
    3. byte[] array = new byte[4];
    4. file.Read(array, 0, 4);
    5. string str1 = System.Text.Encoding.Default.GetString(array);
    6. Console.WriteLine($"先读两个:{str1}");
    7. long seekLength = file.Seek(4, SeekOrigin.Current);
    8. byte[] array1 = new byte[1024];
    9. file.Read(array1, 0, 1024);
    10. string str = System.Text.Encoding.Default.GetString(array1);
    11. Console.WriteLine($"用SeekOrigin.Current 4 :{str}");
    12. file.Flush();
    13. }
    14. }

    打印:

    6.SetLength

    SetLength(Int64)     
    将该流的长度设置为给定值。

    1. public void SetLength() {
    2. using(file = new FileStream(path, FileMode.OpenOrCreate)) {
    3. Console.WriteLine($"获取流的长度(以字节为单位):{file.Length}");
    4. file.SetLength(100);
    5. Console.WriteLine($"获取流的长度(以字节为单位):{file.Length}");
    6. file.Flush();
    7. }
    8. }

    打印:

    7.其他

    Lock(Int64, Int64)     
    防止其他进程读取或写入 FileStream。
    Unlock(Int64, Int64)     
    允许其他进程访问以前锁定的某个文件的全部或部分。

    Flush()     
    清除此流的缓冲区,使得所有缓冲数据都写入到文件中。
    Flush(Boolean)     
    清除此流的缓冲区,将所有缓冲数据都写入到文件中,并且也清除所有中间文件缓冲区。
    FlushAsync(CancellationToken)     
    异步清理此流的所有缓冲区,导致所有缓冲数据都写入基础设备,并且监控取消请求。

    Dispose(Boolean)     
    释放由 FileStream 占用的非托管资源,还可以另外再释放托管资源。

  • 相关阅读:
    嵌入式开发:嵌入式基础——代码和数据空间揭秘
    Java PipedOutputStream类简介说明
    webrtc nack
    leetcode刷题:哈希表07 (三数之和)
    【ROS2原理16】SROS 2 访问控制策略
    智云通CRM:客户说“我们已经有供应商了”,我们该如何回应?
    高性能MySQL实战第02讲:深入理解事务与锁机制(上)
    Elasticsearch 集群时的内部结构是怎样的?
    初识c++
    SpringBoot+Vue小区物业管理系统 附带详细运行指导视频
  • 原文地址:https://blog.csdn.net/SmillCool/article/details/127791714