目录
如果不需要将文件指针改变到任意位置,则可以使用StreamWriter类和StreamReader类,以字符数据的形式访问文件.
StreamReader 类
https://docs.microsoft.com/zh-cn/dotnet/api/system.io.streamreader?view=netcore-3.1
StreamReader类允许从文件中以字符的形式读取数据,它会自动处理底层的数据转换。可以从OpenFileDialog控件中获取文件的名称,然后用该文件名和StreamReader类来读取文件中的数据。
StreamReader类包含于System.IO命名空间中,因此在使用StreamReader类之前,必须引入System.IO命名空间。创建StreamReader对象最常见的方法是使用前面创建的FileStream对象:
Dim afile As FileStream = New FileStream("C:\Log.txt",Filemode.Open)
Dim sr As StreamReader = New StreamReader(afile)
StreamReader类也可以直接在包含具体文件路径的字符串中创建:
Dim sr As StreamReader = New StreamReader("C:\Log.txt")
使用StreamReader.ReadLine()方法从文件中读取文本。该方法会读取回车符之前的文本,并以字符串的形式返回文本。当到达文件末尾时,该方法会返回空值,通过这种方法可以测试文件是否已经到达末尾。
Dim sr As StreamReader = New StreamReader("C:\Log.txt")
Dim strLine As String= sr.ReadLine( )
While strLine <> Nothing
strLine = sr.ReadLine( )
End While
sr.Close( )
方法
Close() | 关闭 StreamReader 对象和基础流,并释放与读取器关联的所有系统资源。 |
Peek() | 返回下一个可用字符,但不使用它。 |
Read() | 读取输入流中的下一个字符并使该字符位置提升一个字符。 |
Read(Char[], Int32, Int32) | 从指定的索引位置开始将来自当前流的指定的最多字符读到缓冲区。 |
Read(Span<Char>) | 将当前流中的字符读入范围。 |
ReadBlock(Char[], Int32, Int32) | 从当前流中读取指定的最大字符数并从指定的索引位置开始将该数据写入缓冲区。 |
ReadBlock(Span<Char>) | 从当前流中读取字符并将数据写入缓冲区。 |
ReadLine() | 从当前流中读取一行字符并将数据作为字符串返回。 |
ReadToEnd() | 读取来自流的当前位置到结尾的所有字符。 |
读取数据最简单的方法是Read(),该方法将流的下一个字符作为正整数值返回,如果到达流的结尾处,则返回-1,可以使用Convert类将该值转换为字符。
'参数2,防止读中文出乱码
Dim sr As StreamReader= New StreamReader("C:\Log.txt",System.Text.Encoding.Default)
Dim nChar As Integer
nChar = sr.Read( )
While nChar <> -1
Console.WriteLine(Conver.ToChar(nChar))
nChar =sr.Read( )
End While
sr.Clase( )
对于小型文件,可以使用ReadToEnd()方法读取整个文件,并将其作为字符串返回。
示例:StreamReader读取客户信息
(1)创建一个新的Windows窗体应用程序ReadCSVFile,将类文件名修改为CustomerInfo.vb,将窗体的Text属性设置为“客户信息”
(2)设计如图所示的窗体,并修改其Name属性和Text属性。
(3)添加如下变量,以处理读取的数据。
Imports System.IO
Public Class CustomerInfo
Private strLine As String
Private strArray() As String
Private strSeparator() As Char = {System.Convert.ToChar(",")}
Private sr As StreamReader
End Class
变量strLine用于保存当前读取的行,字符串数组strArray用于保存读取记录中的字段,变量strSeparater用于保存分隔符,这里的初始分隔符为逗号。在该行代码中使用System.Convert类的ToChar()方法显式地把字符串数据类型转换为字符数据类型。
(4)为窗体添加Load事件处理程序。
Private Sub CustomerInfo_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
sr = New StreamReader("j:\test\CustomerInfo.txt", System.Text.Encoding.Default)
End Sub
(5)为“下一个”按钮添加Click事件处理程序。
Private Sub btnNext_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnNext.Click
strLine = sr.ReadLine
If strLine <> Nothing Then
strArray = strLine.Split(strSeparator)
txtName.Text = strArray(0)
txtPhone.Text = strArray(1)
txtAddress.Text = strArray(2)
End If
End Sub
(6)为“退出”按钮添加Click事件处理程序,关闭StreamReader流并退出程序。
Private Sub bntExit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bntExit.Click
sr.Close()
Application.Exit()
End Sub
(7)在F盘中创建文件Customerlnfo.txt,并输入如下的文本:
李雷,13937272408,世纪家园
韩梅梅,6862645,世纪名城
(8)运行程序,单击“下一个”按钮,就可以逐行查看文件中的内容口。