目录
FileStream 类
https://docs.microsoft.com/zh-cn/dotnet/api/system.io.filestream?view=netcore-3.1
构造函数
FileStream(String, FileMode) | 使用指定的路径和创建模式初始化 FileStream 类的新实例。 |
FileStream(String, FileMode, FileAccess) | 使用指定的路径、创建模式和读/写权限初始化 FileStream 类的新实例。 |
FileMode 枚举
Append | 若存在文件,则打开该文件并查找到文件尾,或者创建一个新文件。 |
Create | 指定操作系统应创建新文件。 如果此文件已存在,则会将其覆盖。 |
CreateNew | 指定操作系统应创建新文件。 这需要 Write 权限。 如果文件已存在,则将引发 IOException异常。 |
Open | 指定操作系统应打开现有文件。 打开文件的能力取决于 FileAccess 枚举所指定的值。 如果文件不存在,引发一个 FileNotFoundException 异常。 |
OpenOrCreate | 指定操作系统应打开文件(如果文件存在);否则,应创建新文件。 如果用 |
Truncate | 指定操作系统应打开现有文件。 该文件被打开时,将被截断为零字节大小。 这需要 Write 权限。 尝试从使用 |
FileAccess 枚举
Read | 对文件的读访问。 可从文件中读取数据。 与 |
ReadWrite | 对文件的读写访问权限。 可从文件读取数据和将数据写入文件。 |
Write | 文件的写访问。 可将数据写入文件。 与 |
属性
CanRead | 获取一个值,该值指示当前流是否支持读取。 |
CanSeek | 获取一个值,该值指示当前流是否支持查找。 |
CanWrite | 获取一个值,该值指示当前流是否支持写入。 |
Length | 获取流的长度(以字节为单位)。 |
Name | 获取 |
Position | 获取或设置此流的当前位置。 |
方法
BeginRead(Byte[], Int32, Int32, AsyncCallback, Object) | 开始异步读操作。 请考虑改用 ReadAsync(Byte[], Int32, Int32, CancellationToken)。 |
BeginWrite(Byte[], Int32, Int32, AsyncCallback, Object) | 开始异步写操作。 请考虑改用 WriteAsync(Byte[], Int32, Int32, CancellationToken)。 |
CopyTo(Stream) | 从当前流中读取字节并将其写入到另一流中。 (继承自 Stream) |
EndRead(IAsyncResult) | 等待挂起的异步读操作完成。 (请考虑改用 ReadAsync(Byte[], Int32, Int32, CancellationToken)。) |
EndWrite(IAsyncResult) | 结束异步写入操作,在 I/O 操作完成之前一直阻止。 (请考虑改用 WriteAsync(Byte[], Int32, Int32, CancellationToken)。) |
Equals(Object) | 确定指定的对象是否等于当前对象。 (继承自 Object) |
Flush() | 清除此流的缓冲区,使得所有缓冲数据都写入到文件中。 |
Read(Byte[], Int32, Int32) | 从流中读取字节块并将该数据写入给定缓冲区中。 |
Read(Span<Byte>) | 从当前文件流中读取字节序列,并在该文件流中按照读取的字节数提升位置。 |
ReadByte() | 从文件中读取一个字节,并将读取位置提升一个字节。 |
SetLength(Int64) | 将该流的长度设置为给定值。 |
Write(Byte[], Int32, Int32) | 将字节块写入文件流。 |
Write(ReadOnlySpan<Byte>) | 将字节的序列从只读范围写入当前文件流,并按写入的字节数向前移动此文件流中的当前位置。 |
WriteByte(Byte) | 一个字节写入文件流中的当前位置。 |
另外,File和FileInfo类都提供了OpenRead()方法和OpenWnte()方法,这更易于创建FileStream对象。0penRead()方法以只读方式访问文件,OpenWrite()方法以只写方式访问文件。这些都提供了快捷方式,不心以FileStream构造函数的参数形式提供前面所有的信息。例如,下面的代码段以只读方式打开Data.txt文件:
Dim aFile As FileStream=File.OpenRead(¨Data.txt")
下面的代码实现了同样的功能:
Dim afilelnfo As Filelnfo = New Filelnfo("Data.txt")
Dim afile As FileScream = afilelnfo.OpenRead( )
在FileStream类内部包含一个文件指针,该指针指向文件中下一次读写操作的位置。在大多数情况下,当打开文件时,它指向文件的开始位置。通过调用Seek()方法可以修改该指针的指向位置,这样就允许应用程序在文件的任何位置读写,随机访问,或者直接跳到文件的特定位置。当处理大型文件时,这可以节省时间,快速定位到正确位置。
Seek()方法包含两个参数,第一个参数规定文件指针以字节为单位的移动距离;第二个参数规定开始计算的起始位置,用SeekOrigin枚举的一个值表示。SeekOrigin枚举包含3个值:Begin、Current和End。
例如,下面的代码段将文件指针移动到距文件开头12个字节处:
afile.Seek(12, SeekOrigin.Begin)
下面的代码将指针从当前位置向前移动2个字节:
afile.Seek(-2, SeekOrigin.Current)
FileStream类可以方便地定位到文件中的任何位置,但FileStream类只能处理原始字节码,使用FileStream类处理原始字节码的功能可以用于任何数据文件,而不仅仅是文本文件。通过读取字节数据,FileStream对象可以用于读取图像和声音文件。这种代价就是不能使用FileStream类将数据直接读入字符串。如果需要将字节码存入字符串,则需要通过相关的转换类,将字节数组转换为字符数组。
FileStream.Read()方法是从FileStream对象所指向的文件中读取数据的主要手段,该方法从文件中读取数据,再将数据写入一个字节数组。Read()方法的形式如下:
Read(Array()As Byte,offset As Integer,count AS Integer)
其中,第一个参数是存储传输数据的字节数组。第二个参数是字节数据中开始写入数据的位置,它通常为0。最后一个参数为从文件中最多读取的字节数。
示例:随机访问文件中读取数据:
(1)新建一个控件台应用程序ReadFile,将模块文件修改为ReadFileModule.vb。
(2)添加下列代码,使用FileStream读取文件的部分内容。
Imports System.IO
Imports System.Text
Module Module1
Sub Main()
Dim byData(100) As Byte
Dim chrData(100) As Char
Try
Dim aFile As FileStream = New FileStream("J:\test\module1.vb", FileMode.Open)
aFile.Seek(0, SeekOrigin.Begin)
aFile.Read(byData, 0, 100)
Catch ex As Exception
Console.WriteLine("发生IO异常")
Console.WriteLine(ex.ToString)
Console.Read()
Return
End Try
Dim d As Decoder = Encoding.UTF8.GetDecoder
d.GetChars(byData, 0, byData.Length, chrData, 0)
Console.WriteLine(chrData)
Console.Read()
End Sub
End Module
Decoder 类
https://docs.microsoft.com/zh-cn/dotnet/api/system.text.decoder?view=netcore-3.1
将已编码字节的序列转换为一组字符。
Encoder 类
https://docs.microsoft.com/zh-cn/dotnet/api/system.text.encoder?view=netcore-3.1
将一组字符转换为一个字节序列。
示例:使用FileStream对象向文件中写入数据。
(1)新建控制台应用程序WriteFile,修改其模块名为WriteFileModule.vb。
(2)编写下面的代码,向文件中写入数据。
Imports System.IO
Imports System.Text
Module Module1
Sub Main()
Dim byData(100) As Byte
Dim chrData(100) As Char
Try
Dim afile As FileStream = File.OpenWrite("J:\test\WriteFileModule.txt")
Console.WriteLine("输入要保存的数据")
chrData = Console.ReadLine
Dim e As Encoder = Encoding.UTF8.GetEncoder
e.GetBytes(chrData, 0, chrData.length, bydata, 0, True)
afile.Seek(0, SeekOrigin.Begin)
afile.Write(byData, 0, byData.Length)
Catch ex As Exception
Console.WriteLine("发生IO异常")
Console.WriteLine(ex.ToString)
Console.Read()
Return
End Try
End Sub
End Module