流的概念
对于流的概念,在.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
通过以上操作,你可以类比来创建属于自己的文件结构以储存配置信息这些操作。
``
效果如下: