- 深入解析ASP核心技術
- 王洪影
- 1234字
- 2019-01-03 18:16:01
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 = " " '輸出流中的數據
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 追加數據、修改數據和截斷數據的范例
- Vue.js 3.x+Element Plus前端開發實戰
- ODPS權威指南 阿里大數據平臺應用開發實踐
- Python與數據挖掘
- AIDevOps:智能微服務開發、運維原理與實踐
- 偉大的小細節:互聯網產品設計中的微創新思維
- CATIA V5 從入門到精通(第二版)
- MindSpore深度學習高階技術
- TensorFlow+Android經典模型從理論到實戰(微課視頻版)
- Google Android開發入門與實戰
- HTML5游戲編程核心技術與實戰
- 基于EEG的腦源定位與腦功能網絡
- DDD工程實戰:從零構建企業級DDD應用
- 大話軟件工程案例篇:項目與產品開發實戰
- PHP與MySQL高性能應用開發
- 軟件測試進階之路:測試路上你問我答