062流和存取文件

目录

FileStream 类

构造函数

FileMode 枚举

FileAccess 枚举

属性

方法

示例:随机访问文件中读取数据:

Decoder 类

Encoder 类

示例:使用FileStream对象向文件中写入数据。


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

指定操作系统应打开文件(如果文件存在);否则,应创建新文件。 如果用 FileAccess.Read 打开文件,则需要 Read权限。 如果文件访问为 FileAccess.Write,则需要 Write权限。 如果用 FileAccess.ReadWrite 打开文件,则同时需要 Read 和 Write权限。

Truncate

指定操作系统应打开现有文件。 该文件被打开时,将被截断为零字节大小。 这需要 Write 权限。 尝试从使用 FileMode.Truncate 打开的文件中进行读取将导致 ArgumentException 异常。

FileAccess 枚举

Read

对文件的读访问。 可从文件中读取数据。 与 Write 组合以进行读写访问。

ReadWrite

对文件的读写访问权限。 可从文件读取数据和将数据写入文件。

Write

文件的写访问。 可将数据写入文件。 与 Read 组合以进行读写访问。

属性

 
CanRead

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

CanSeek

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

CanWrite

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

Length

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

Name

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

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ngbshzhn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值