深入解析ASP核心技术
上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对象是二进制数据也是可以的,而反过来则不行。