(基础)文件流的使用

流的概念

对于流的概念,在.net中是非常常用的。文件流,二进制流,网络流networkstream等等。这些都是继承自stream这个类。流,顾名思义,即是一种流态形式储存于内存中。用一个简单的比喻,即是水流,水流是一条不断流动的东西,有的河流你可以找到它的来源,也就是流的起始部分及结束部分。有的流无法查找它的结束及起始,也就是有的不支持查找操作,比如网络流,这种流很多时候没办法直接过去长度,没办法获取结束的位置,那么http协议中就会返回一个contentlength长度,可以通过这个来完整读取流。综上,对于流有一个大概的了解,用更为简单的方式来说,就是流就是一种一维的东西,不管读或者写,都是一维形式。如下代码示例,如何储存一个结构体列表,以及如何读取结构体列表。
由于流是位于IO中,因此需要引入这个命名空间,这是一个硬件与软件交互的一个接口,即是如何储存和读取都是通过这个接口来的。

Imports System.IO
Public Class Form1
    Public Structure FileStruct
        Public start As Integer
        Public endoffset As Integer
        Public length As Integer
        '重载tostring函数,以便显示列表框中
        Public Overrides Function ToString() As String
        
            Return String.Format("起始位置{0} 结束位置{1} 长度{2}", start, endoffset, length)
        End Function
    End Structure
    Public Sub WriteLog(ByVal fstruct As FileStruct, ByVal filemd As FileMode)
        Using fs As New FileStream("./log.txt", filemd, FileAccess.Write)

            Dim startbytes = BitConverter.GetBytes(fstruct.start) '将int32转为字节数组
            fs.Write(startbytes, 0, startbytes.Length)'写入流中,同时文件流指针移动。以下按照顺序写入对应的值。
            Dim endbytes = BitConverter.GetBytes(fstruct.endoffset)
            fs.Write(endbytes, 0, endbytes.Length)
            Dim length = BitConverter.GetBytes(fstruct.endoffset)
            fs.Write(length, 0, length.Length)

        End Using
    End Sub
    Public Sub ClearLog()
        File.Create("./log.txt").Dispose()'创建新的文件流以达到清空目的,同时释放文件流,以便后续操作
    End Sub
    Public Function ReadLog() As List(Of FileStruct)
        Dim lst As New List(Of FileStruct)

        Using fs As New FileStream("./log.txt", FileMode.Open, FileAccess.Read)'以读的方式打开流
            Dim buffer(3) As Byte'一个缓存整数的字节数组
            Dim current As Integer
            Dim fstruct As FileStruct '定义一个文件结构
            With fstruct
                current = fs.Read(buffer, 0, 4)
                .start = BitConverter.ToInt32(buffer, 0)'字节数组转为int32
                current = fs.Read(buffer, 0, 4)
                .endoffset = BitConverter.ToInt32(buffer, 0)
                current = fs.Read(buffer, 0, 4)
                .length = BitConverter.ToInt32(buffer, 0)
            End With
            If current = 0 Then '如果读取返回当前可读值为零,即退出读取操作。
                Return lst
            End If
            lst.Add(fstruct)
            Do While current > 0

                With fstruct
                    current = fs.Read(buffer, 0, 4)
                    If current = 0 Then
                        Exit Do
                    End If
                    .start = BitConverter.ToInt32(buffer, 0)
                    current = fs.Read(buffer, 0, 4)
                    .endoffset = BitConverter.ToInt32(buffer, 0)
                    current = fs.Read(buffer, 0, 4)
                    .length = BitConverter.ToInt32(buffer, 0)
                End With
                lst.Add(fstruct)
                
            Loop


        End Using
        Return lst
    End Function
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim fs As FileStruct
        '以下操作赋值filestruct
        With fs
            .start = TextBox1.Text
            .endoffset = TextBox2.Text
            .length = TextBox3.Text
        End With
        '判断文件是否存在,如果存在则追加,否则创建
        If File.Exists("./log.txt") Then
            WriteLog(fs, FileMode.Append)
        Else
            WriteLog(fs, FileMode.Create)
        End If

    End Sub
'一个清空操作
    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        ClearLog()
        ListBox1.Items.Clear()
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
'将读取的结构列表显示到列表框中
        For Each item As FileStruct In ReadLog()
            ListBox1.Items.Add(item)
        Next

    End Sub
End Class

通过以上操作,你可以类比来创建属于自己的文件结构以储存配置信息这些操作。
``
效果如下:
读写效果

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值