Vb.net 内存映射文件vbVerticalTab和vbNullChars显示在结果中
我尝试使用内存映射文件MMF在应用程序之间存储和传输数据 我已经设法创建了一个MMF并“有点”阅读它 这是我的代码:Vb.net 内存映射文件vbVerticalTab和vbNullChars显示在结果中,vb.net,memory-mapped-files,Vb.net,Memory Mapped Files,我尝试使用内存映射文件MMF在应用程序之间存储和传输数据 我已经设法创建了一个MMF并“有点”阅读它 这是我的代码: Public Class Form1 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load createMMF() readMMF() End Sub Sub createMMF() Dim mmf As M
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
createMMF()
readMMF()
End Sub
Sub createMMF()
Dim mmf As MemoryMappedFile = MemoryMappedFile.CreateNew("testmap", 5)
Dim stream As MemoryMappedViewStream = mmf.CreateViewStream()
Dim writer As BinaryWriter = New BinaryWriter(stream)
writer.Write("hello there")
End Sub
Sub readMMF()
Dim mmf As MemoryMappedFile = MemoryMappedFile.OpenExisting("testmap")
Dim stream As MemoryMappedViewStream = mmf.CreateViewStream()
Dim streamReader = New StreamReader(stream)
Dim text = streamReader.ReadToEnd()
Debug.Print(text)
End Sub
End Class
一些问题:
1在CreateNew调用中,我指定了5作为大小,但是当我将.write调用从hello更改为hello时,没有任何区别
2当我在接收函数中读取流时,字符串在那里,但它在开始时包含一个奇怪的字符,在调试器上下文中被解码为vbVerticalTab,随后包含大量vbNullChars
我希望能够在进程之间传递10Kb的字符串,并在开始和结束时准确地获得一个没有奇数字符的字符串。好的,多亏了我的评论,我才能够使这个工作正常。这是使用二进制编写器/读取器的代码
Sub createMMF()
Dim mmf As MemoryMappedFile = MemoryMappedFile.CreateNew("testmap", 11)
Dim stream As MemoryMappedViewStream = mmf.CreateViewStream()
Dim writer As BinaryWriter = New BinaryWriter(stream)
writer.Write("hello there")
End Sub
Sub readMMF()
Dim mmf As MemoryMappedFile = MemoryMappedFile.OpenExisting("testmap")
Dim stream As MemoryMappedViewStream = mmf.CreateViewStream()
Dim binaryReader = New BinaryReader(stream)
Dim length = binaryReader.Read() 'gives 11, length of "hello there" string.
Dim text = binaryReader.ReadChars(length)
Debug.Print(text)
End Sub
此外,我使用StreamReader/Writer对进行了测试。我不得不在writer中使用.flush调用,ReadToEnd方法仍然有大量空字符填充
Sub createMMF()
Dim mmf As MemoryMappedFile = MemoryMappedFile.CreateNew("testmap", 11)
Dim stream As MemoryMappedViewStream = mmf.CreateViewStream()
Dim writer As StreamWriter = New StreamWriter(stream)
writer.Write("hello there")
writer.Flush()
End Sub
Sub readMMF()
Dim mmf As MemoryMappedFile = MemoryMappedFile.OpenExisting("testmap")
Dim stream As MemoryMappedViewStream = mmf.CreateViewStream()
Dim streamReader = New StreamReader(stream)
Dim text = streamReader.ReadToEnd()
Debug.Print(text)
End Sub
检查结果可以看到vbNull字符
有一件事在我的测试中没有什么不同,那就是.CreateNew方法的Capacity参数。即使在两个示例中的字符串长度中都输入1,也不受影响。根据我对文档的读取,应将此字节值设置为为为任务保留足够的内存。您正在使用BinaryWriter进行写入,例如字符串长度。然后,您将使用StreamReader来阅读它,StreamReader需要没有任何元数据的原始文本。使用写入程序和读取器的匹配对,并显式指定编码。BinaryWriter对字符串进行编码,必须使用BinaryReader将其读回。奇怪字符是编码字符串长度的字节。出现空字符是因为您读得太多。