官术网_书友最值得收藏!

2.3.5 操作Stream對象

Stream對象就像一個容器,剛開始的時候,它是空的,我們寫入一些數據的時候,它就自動擴大,以容納這些數據。我們緊接著再寫入一些數據,它就再次擴大,以此類推。但是,它只會主動擴大,而不會主動縮小,縮小這個動作需要我們指示它來做。Write、WriteText和CopyTo方法,都是從當前位置開始寫入數據,寫到哪里算哪里,之后的數據不會被刪除。

下面看一下Stream對象的基本操作。

1. Stream對象的大小

Size屬性返回當前Stream對象中數據的字節數,不管是文本方式還是二進制方式,返回的始終是字節數。對于從文件讀入的數據,Size屬性不一定代表文件的大小,因為數據的開頭可能加入了前綴。

2. 移動指針

變更Position屬性即可,最小為0,最大為Size屬性的值,超過則報錯。指針移動的單位是字節。

3. 當前位置是否是末尾

使用EOS屬性即可,如果是末尾,即Position等于Size的時候返回True,否則返回False。

4. 追加數據

當指針位于流的末尾時,即EOS屬性為True時,寫入的數據是追加到流的末尾的。如果想在流的中間插入數據,那么,很遺憾,沒有直接的方法。但我們可以將數據復制到另一個Stream對象,在復制的過程中插入數據即可,然后使用復制后的Stream對象。

5. 修改數據

移動指針到指定的位置,再次寫入數據即可,寫入幾個字節就覆蓋幾個字節。如果超過了流的末尾,則流會自動擴大,以容納多余的數據。

6. 截斷數據

如果某個位置之后的數據不要了,可以將指針移動到那里,然后調用SetEOS方法,之后的數據就會被拋棄,當前位置變為流的末尾,流的Size屬性也變小了。如果流中間位置的某段數據不要了,想要截斷拋棄,也是沒有直接的方法的,也可以通過Stream對象間的數據復制來間接實現。

下面的例子演示的是Size屬性、Position屬性和EOS屬性。

StreamPosition.asp

<%@codepage=936%>
<%
Response.Charset="GBK"
Dim stream
Set stream = Server.CreateObject("ADODB.Stream")
stream.Type = 2    '文本方式
stream.Charset = "GBK"
stream.Open
stream.WriteText "編碼"

'輸出大小等信息
response.write "大?。? & stream.Size & "<br>"
response.write "位置:" &stream.Position & "<br>"
response.write "末尾:" &stream.EOS & "<br>"
response.write "字符長度:" &Len(stream.ReadText) & "<br><br>"

'移動到位置0,即從第一個字節開始讀取
stream.Position = 0
response.write "字符:" &stream.ReadText(1) & "<br>"
response.write "位置:" &stream.Position & "<br>"
response.write "末尾:" &stream.EOS & "<br><br>"

'再讀一個字符
response.write "字符:" &stream.ReadText(1) & "<br>"
response.write "位置:" &stream.Position & "<br>"
response.write "末尾:" &stream.EOS & "<br>"

stream.close
Set stream = nothing
%>

運行結果如圖2-20所示。

圖2-20 Stream對象操作范例

當指針指向流的末尾時,讀取數據將得到空字符串(圖中輸出字符長度為0),同時指針是不會移動的,仍然指向末尾。

如果將Charset變更為UTF-8,則運行結果如圖2-21所示。流的長度變為9,因為在UTF-8編碼中,一個漢字占3個字節,兩個漢字是6個字節,另外還有3個字節的前綴。讀取第一個字符的時候,指針從0跳到了6,它自動跳過了3個字節的前綴。

圖2-21 Charset為UTF-8時的運行結果

下面看一下追加數據、修改數據和截斷數據的范例。

StreamCutData.asp

<%@codepage=936%>
<%
Response.Charset="GBK"
twoSpace = "&nbsp; &nbsp; "

'輸出流中的數據
Sub printStream(stream)
    Dim savePosition
    savePosition = stream.Position           '保存指針位置

    '輸出數據
    stream.Position = 0
    response.write "流中的數據:" & stream.ReadText & "<br><br>"

    stream.Position = savePosition           '恢復指針位置
End Sub

Dim stream
Set stream = Server.CreateObject("ADODB.Stream")
stream.Type = 2                              '文本方式
stream.Charset = "GBK"
stream.Open

'寫入數據
stream.WriteText "0000000000"
response.write "大?。? & stream.Size & twoSpace
response.write "位置:" &stream.Position & "<br>"
Call printStream(stream)

'繼續寫入數據,此時數據是追加的
stream.WriteText "1111111111"
response.write "大小:" & stream.Size & twoSpace
response.write "位置:" &stream.Position & "<br>"
Call printStream(stream)

'移動到位置5
stream.Position = 5
stream.WriteText "22222"
response.write "大?。? & stream.Size & twoSpace
response.write "位置:" &stream.Position & "<br>"
Call printStream(stream)

'移動到位置15
stream.Position = 15
stream.WriteText "3333333333"
response.write "大?。? & stream.Size & twoSpace
response.write "位置:" &stream.Position & "<br>"
Call printStream(stream)

'移動到位置20,截斷數據
stream.Position = 20
stream.SetEOS
response.write "大?。? & stream.Size & twoSpace
response.write "位置:" &stream.Position & "<br>"
call printStream(stream)

stream.close
Set stream = nothing
%>

運行結果如圖2-22所示。

圖2-22 追加數據、修改數據和截斷數據的范例

主站蜘蛛池模板: 乌拉特后旗| 绥宁县| 苏尼特右旗| 东城区| 沙坪坝区| 桐柏县| 亳州市| 黄平县| 乌兰县| 招远市| 浏阳市| 临西县| 乌海市| 光山县| 汤阴县| 简阳市| 平和县| 大余县| 仪征市| 西城区| 西华县| 进贤县| 吉林省| 汽车| 静宁县| 洛宁县| 双城市| 巴青县| 万州区| 大余县| 永寿县| 萍乡市| 重庆市| 甘洛县| 太湖县| 天柱县| 罗城| 卓资县| 北碚区| 循化| 云和县|