在學(xué)習(xí)字符數(shù)據(jù)流之前,看一個例子,在定義時不同的構(gòu)造構(gòu)造方法會出現(xiàn)不同的結(jié)果:
- Imports System.IO
- Imports System.Text
- Public Class Form1
- Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
- Dim sr As New StreamReader("D:\11.txt")
- 'Dim sr As New StreamReader("D:\11.txt", Encoding.Default)
- TextBox1.Text = sr.ReadToEnd
- sr.Close()
- End Sub
- End Class
原因是編碼的不同,最后顯示的漢字有可能是亂碼。這提醒我們在漢字的I/O時要注意編碼。
.
正題 :字符數(shù)據(jù)流的結(jié)構(gòu):
TextReader與TextWriter類是抽象類,其基本方法與Stream類相似。
它們的主要區(qū)別在于:TextReader與TextWriter通過特定字符集編碼方式轉(zhuǎn)換成字節(jié)數(shù)據(jù),完成字符數(shù)據(jù)的存取。
一、TextReader與TextWriter類
讀寫文本數(shù)據(jù)的基類是TextReader與TextWriter類。
這兩個抽象類定義了從數(shù)據(jù)流或文本字符串中讀寫的基本功能,如Read、Peek等,與Stream類類似,差異是讀取的是
字符串,而不是字節(jié)。
TextReader的方法有:Read、ReadLine、ReadToEnd
TextWriter的方法有:Writer、WriterLine
比如:
- '===========TextReader=========================
- '讀取文本讀取器中的下一個字符并使該字符的位置提升一個字符
- Public Overridable Function Read() As Integer
-
- '從當(dāng)前讀取器中讀取指定數(shù)目的字符并從指定索引開始將該數(shù)據(jù)寫入緩沖區(qū)
- Public Overridable Function Read(<OutAttribute> buffer As Char(), index As Integer, count As Integer) As Integer
-
- '從文本讀取器中讀取一行字符并將數(shù)據(jù)作為字符串返回
- Public Overridable Function ReadLine() As String
-
- '讀取從當(dāng)前位置到文本讀取器末尾的所有字符并將它們作為一個字符串返回
- Public Overridable Function ReadToEnd() As String
-
-
- '======TextWriter============================
- '將字符寫入該文本字符串或流。
- Public Overridable Sub Write(value As Char)
- Public Overridable Sub Write(buffer As Char())
- Public Overridable Sub Write(value As Integer)
-
- '將行結(jié)束符的字符串寫入文本字符串或流
- Public Overridable Sub WriteLine()
- Public Overridable Sub WriteLine(value As Char)
-
-
- '將后跟行結(jié)束符的字符子數(shù)組寫入文本字符串或流
- Public Overridable Sub WriteLine(buffer As Char(), index As Integer, count As Integer)
二、創(chuàng)建StreamReader對象
TextReader派生出StreamReader類,StreamReader從派生于Stream類的子類中讀取數(shù)據(jù)。
StreamReader構(gòu)造有根據(jù)基礎(chǔ)流Stream來構(gòu)造、根據(jù)文件名來構(gòu)造:
- '為指定的流初始化 StreamReader 類的新實例
- Public Sub New(stream As Stream)
-
- '為指定的文件名初始化 StreamReader 類的新實例。
- Public Sub New(path As String)
-
-
-
-
- '帶編碼方式的上面兩類
- Public Sub New(stream As Stream, encoding As Encoding)
- Public Sub New(path As String, encoding As Encoding)
注意:StreamReader本身不能取得流的長度,只能由基類的流來取得(微軟翻譯為基礎(chǔ)流):
StreamReader.BaseStream.Length
對于漢字情況,請選擇Encoding.Default試試
三、StreamReader屬性
BaseStream 返回基礎(chǔ)流。
CurrentEncoding 獲取當(dāng)前 StreamReader 對象正在使用的當(dāng)前字符編碼。
EndOfStream 獲取一個值,該值表示當(dāng)前的流位置是否在流的末尾。(True/False)
四、StreamReader常用方法
讀取文本文件中最常見的是: ReadLine、ReadToEnd、Peek、Read。
- '返回下一個可用的字符,但不移動流位置(常用于探測下一字符或是否結(jié)束)
- Public Overrides Function Peek As Integer
-
-
- '讀取輸入流中的下一個字符并使該字符的位置提升一個字符。
- Public Overrides Function Read As Integer
-
- '從當(dāng)前流中將指定的最多個字符讀到指定索引位置開始的緩沖區(qū)
- Public Overrides Function Read (buffer As Char(),index As Integer, count As Integer ) As Integer
-
-
- Public Overrides Function ReadLine As String
- Public Overrides Function ReadToEnd As String
五、StreamWriter類
StreamWriter與StreamReader對應(yīng)。創(chuàng)建對象時一樣:由流或文件名來創(chuàng)建
1、構(gòu)造:
StreamWriter(Stream)
用 UTF-8 編碼及默認緩沖區(qū)大小,為指定的流初始化 StreamWriter 類的一個新實例。
StreamWriter(String)
用默認編碼和緩沖區(qū)大小,為指定的文件初始化 StreamWriter 類的一個新實例。
StreamWriter(Stream, Encoding)
用指定的編碼及默認緩沖區(qū)大小,為指定的流初始化 StreamWriter 類的新實例。
StreamWriter(String, Boolean)
用默認編碼和緩沖區(qū)大小,為指定的文件初始化 StreamWriter 類的一個新實例。 如果該文件存在,
則可以將其覆蓋或向其追加。 如果該文件不存在,則此構(gòu)造函數(shù)將創(chuàng)建一個新文件。
2、寫入方法:
主要有兩個:Write、 WriterLine
還有一個隱形的Flush,清理當(dāng)前編寫器的所有緩沖區(qū),并使所有緩沖數(shù)據(jù)寫入基礎(chǔ)流。
具體如:
Public Sub Writer(ByVal buffer() as Char)
Public Sub Writer(byVal buffer() as Char,ByVal index As Integer,Byval count As Integer)
Public Sub Writer(ByVal value As String)
六、StringReader與StringWriter
它是以字符串為數(shù)據(jù)源,前面的是以Stream為數(shù)據(jù)源。
所以構(gòu)造方法是以字串:
Public Sub New(ByVal s As String)
Public Sub New (ByVal sb as StringBuilder)
同前面的StreamReader、StreamWriter一樣,
StringReader的方法有:Peek、Read、ReadLine、ReadToEnd
StringWriter的方法有:Writer、WriterLine
唯一不同的,取是基礎(chǔ)流的是用:GeStringBuilder 它返回數(shù)據(jù)源(前面是用BaseStream)
以一個例子結(jié)束吧:
- Imports System.IO
- Public Class Form1
- Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
- Dim sr As New StreamReader("D:\11.txt")
- Dim e1() As String
- Dim e2() As String
-
- Do Until sr.EndOfStream
- If sr.ReadLine = "EA" Then Exit Do
- Loop
-
- e1 = Split(sr.ReadLine)
- e2 = Split(sr.ReadLine)
-
- For i As Int32 = 0 To UBound(e2)
- ListBox1.Items.Add(CInt(e2(i)))
- Next
-
- sr.Close()
- End Sub
- End Class
|