上QQ阅读APP看书,第一时间看更新
2.3.7 Stream对象间的数据复制
两个Stream对象间是可以相互复制数据的,在源Stream对象上使用CopyTo方法即可,格式如下:
objStream.CopyTo 目标Stream,字符数/字节数
第二个参数是要复制的字符数或字节数,文本方式时指字符数,二进制方式时指字节数。如果省略,则复制的是从源Stream当前位置到末尾的所有数据。
StreamCopy.asp
<%@codepage=936%> <% Response.Charset="BIG5" '复制源 Dim stream Set stream = Server.CreateObject("ADODB.Stream") stream.Type = 2 '文本方式 stream.Charset = "GBK" stream.Open stream.WriteText "編碼" stream.Position = 0 '指针移回0位置,以便读取文本 '复制目标 Dim streamTo Set streamTo = Server.CreateObject("ADODB.Stream") streamTo.Type = 2 '文本方式 streamTo.Charset = "BIG5" streamTo.Open streamTo.WriteText "A" '复制一个字符,即“編”字 stream.copyTo streamTo,1 '输出目标流中的文本 streamTo.position=0 '指针移回0位置 response.codepage=950 response.write streamTo.ReadText streamTo.close Set streamTo = nothing stream.close Set stream = nothing %>
运行结果如图2-25所示。
图2-25 Stream对象间复制数据
使用CopyTo方法后,源Stream对象和目标Stream对象的指针的位置都会变化。此例中,只复制了一个字符,那么执行CopyTo方法后,源Stream对象的指针指向位置2,即Position=2,而目标Stream对象的指针指向位置3。
指针移动过程如图2-26所示。
图2-26 指针移动示意图
如果你够细心的话,会发现复制过去的数据是BD 73,而不是BE 8E,这是为什么呢?复制的过程,实际上就相当于从源Stream对象读取指定的文本,然后再写入目标Stream对象。读取时,是Charset指定编码到Unicode编码的转换,写入时则反之。概括来说,文本方式时,CopyTo方法暗含编码转换的过程。
二进制方式时,数据是原样复制的,不进行任何转换。
执行数据复制的两个Stream对象,原则上类型应该是一致的,要么都是文本数据,要么都是二进制数据。但实际上,源Stream对象是文本数据、目标Stream对象是二进制数据也是可以的,而反过来则不行。