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()是

public virtual void Close()
{
this.Dispose(true);
GC.SuppressFinalize(this);
}

3.Dispose() 是

public void Dispose()
{
this.Close();
}

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()可以不用知道流长度下设置位置

例如:

    public void Seek() {
        using(file = new FileStream(path, FileMode.OpenOrCreate)) {
            byte[] array = new byte[4];
            file.Read(array, 0, 4);
            string str1 = System.Text.Encoding.Default.GetString(array);
            Console.WriteLine($"先读两个:{str1} 流的位置 :{file.Position}");

            long seekLength = file.Seek(4, SeekOrigin.Current);
            byte[] array1 = new byte[1024];
            file.Read(array1, 0, 1024);
            string str = System.Text.Encoding.Default.GetString(array1);
            Console.WriteLine($"用SeekOrigin.Current 4 :{str} 流的位置 :{file.Position} seekLength:{seekLength}");

            file.Flush();
        }
    }

打印:

空格是
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)。)

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

打印:


2.同步写

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

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

打印:

3.异步读

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

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

打印:

4.同步读

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

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

打印:

5.Seek

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

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

打印:


2.SeekOrigin.End

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

打印:


3.SeekOrigin.Current

public void Seek() {
        using(file = new FileStream(path, FileMode.OpenOrCreate)) {
            byte[] array = new byte[4];
            file.Read(array, 0, 4);
            string str1 = System.Text.Encoding.Default.GetString(array);
            Console.WriteLine($"先读两个:{str1}");

            long seekLength = file.Seek(4, SeekOrigin.Current);
            byte[] array1 = new byte[1024];
            file.Read(array1, 0, 1024);
            string str = System.Text.Encoding.Default.GetString(array1);
            Console.WriteLine($"用SeekOrigin.Current 4 :{str}");

            file.Flush();
        }
    }

打印:

6.SetLength

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

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

打印:

7.其他

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

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

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

猜你喜欢

转载自blog.csdn.net/SmillCool/article/details/127791714