目录
二.Flush, Close , Dispose,using
FileStream 类主要用于文件的读写不仅能读写普通的文本文件,还可以读取图像文件、声音文件等不同格式的文件
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()
Begin 0
指定流的开始位置。Current 1
指定流中的当前位置。End 2
指定流的结束位置。
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();
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 对象所封装的文件的操作系统文件句柄。
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();
- }
- }
打印:
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();
- }
- }
打印:
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();
- }
- }
打印:
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();
- }
- }
打印:
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();
- }
- }
打印:
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();
- }
- }
打印:
Lock(Int64, Int64)
防止其他进程读取或写入 FileStream。
Unlock(Int64, Int64)
允许其他进程访问以前锁定的某个文件的全部或部分。
Flush()
清除此流的缓冲区,使得所有缓冲数据都写入到文件中。
Flush(Boolean)
清除此流的缓冲区,将所有缓冲数据都写入到文件中,并且也清除所有中间文件缓冲区。
FlushAsync(CancellationToken)
异步清理此流的所有缓冲区,导致所有缓冲数据都写入基础设备,并且监控取消请求。
Dispose(Boolean)
释放由 FileStream 占用的非托管资源,还可以另外再释放托管资源。