vb.net 文件流在解码字节后获得空格
vb.net Filestream getting spaces after decoding bytes
我不确定发生了什么。我认为我根本没有更改代码,但出于某种原因,在使用 FileStream 对象读取文件的字节后,返回的字符之间出现空格:
'Turn off Raise Events until after change is checked
fsw.EnableRaisingEvents = False
'read from current seek position to end of file
Dim bytesRead(_maxBytes) As Byte
Dim fs As New FileStream(_filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)
If (fs.Length > _maxBytes) Then
previousSeekPosition = fs.Length - _maxBytes
End If
previousSeekPosition = fs.Seek(previousSeekPosition, SeekOrigin.Begin)
Dim numBytes = fs.Read(bytesRead, 0, _maxBytes)
fs.Close()
previousSeekPosition += numBytes
Dim sb As New StringBuilder()
For i = 0 To numBytes - 1
sb.Append(bytesRead(i))
Next
'Raise the event to show data
If Not blnFirstRun Then
RaiseEvent MoreData(Me, Encoding.ASCII.GetString(bytesRead, 0, _maxBytes), _filename, _fileDescription)
Else
blnFirstRun = False
End If
'Check the changes against the alerts
AlertChange(Encoding.ASCII.GetString(bytesRead, 0, _maxBytes))
'Turn Raise Events back on
fsw.EnableRaisingEvents = True
我将 _maxBytes 设置为 16384。我基本上是在文件发生更改时从最后已知的读取位置读取文件(类似于 Linux Tail 所做的)。
我在一个文件上对其进行了测试,它似乎运行良好。但是,出于某种原因,它不想再工作了。我 不认为 我改变了任何东西 - 但它现在 returns 现在用空格改变了。
例如:
我有一个附加了“9999”的文件。当我 运行 Encoding.ASCII.GetString 例程时,它显示为:'9 9 9 9'。
我觉得我正在为一些可能非常简单的事情撞墙。希望有人快点知道答案。
将“9999”写入文件时得到“9 9 9 9”这一事实表明写入文件的任何内容都使用 UTF-16 编码,每个字符至少使用两个字节 (参考:Wikipedia: Comparison of Unicode encodings).
使用十六进制编辑器检查文件应该会显示是否确实如此。
请注意Encoding.Unicode Property中的备注,以防出现问题。
我不确定发生了什么。我认为我根本没有更改代码,但出于某种原因,在使用 FileStream 对象读取文件的字节后,返回的字符之间出现空格:
'Turn off Raise Events until after change is checked
fsw.EnableRaisingEvents = False
'read from current seek position to end of file
Dim bytesRead(_maxBytes) As Byte
Dim fs As New FileStream(_filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)
If (fs.Length > _maxBytes) Then
previousSeekPosition = fs.Length - _maxBytes
End If
previousSeekPosition = fs.Seek(previousSeekPosition, SeekOrigin.Begin)
Dim numBytes = fs.Read(bytesRead, 0, _maxBytes)
fs.Close()
previousSeekPosition += numBytes
Dim sb As New StringBuilder()
For i = 0 To numBytes - 1
sb.Append(bytesRead(i))
Next
'Raise the event to show data
If Not blnFirstRun Then
RaiseEvent MoreData(Me, Encoding.ASCII.GetString(bytesRead, 0, _maxBytes), _filename, _fileDescription)
Else
blnFirstRun = False
End If
'Check the changes against the alerts
AlertChange(Encoding.ASCII.GetString(bytesRead, 0, _maxBytes))
'Turn Raise Events back on
fsw.EnableRaisingEvents = True
我将 _maxBytes 设置为 16384。我基本上是在文件发生更改时从最后已知的读取位置读取文件(类似于 Linux Tail 所做的)。
我在一个文件上对其进行了测试,它似乎运行良好。但是,出于某种原因,它不想再工作了。我 不认为 我改变了任何东西 - 但它现在 returns 现在用空格改变了。
例如:
我有一个附加了“9999”的文件。当我 运行 Encoding.ASCII.GetString 例程时,它显示为:'9 9 9 9'。
我觉得我正在为一些可能非常简单的事情撞墙。希望有人快点知道答案。
将“9999”写入文件时得到“9 9 9 9”这一事实表明写入文件的任何内容都使用 UTF-16 编码,每个字符至少使用两个字节 (参考:Wikipedia: Comparison of Unicode encodings).
使用十六进制编辑器检查文件应该会显示是否确实如此。
请注意Encoding.Unicode Property中的备注,以防出现问题。