flash.utilsProxy Proxy 类用于覆盖对象的 ActionScript 操作(如检索和修改属性)的默认行为。Object Proxy 类用于覆盖对象的 ActionScript 操作(如检索和修改属性)的默认行为。

Proxy 类没有构造函数,您不应尝试实例化 Proxy。而是应使用 Proxy 类的子类来覆盖诸如 getProperty 之类的方法并提供自定义行为。如果尝试使用 Proxy 类的某个方法而不覆盖该方法,则会引发异常。

同时请记住,您自己的用于覆盖 Proxy 类的方法的代码也可能会意外引发异常。在使用这些方法时引发异常会导致问题,因为调用代码(使用诸如 inisdelete 等运算符)不应该有异常。除非已经确信您的覆盖方法不会引发异常,否则 Adobe 建议在实现 Proxy 类的前后使用 try..catch 语句,以避免在运算符调用您的方法时出现致命错误。例如:

dynamic class MyProxy extends Proxy { flash_proxy override function callProperty(name:~~, ...rest):~~ { try { // custom code here } catch (e:Error) { // respond to error here } }

Proxy 类取代了 ActionScript 2.0 的 Object.__resolveObject.addProperty 功能,ActionScript 3.0 中不再提供这些功能。利用 Object.addProperty() 功能可以在 ActionScript 2.0 中动态地创建 get 和 set 方法。尽管 ActionScript 3.0 在编译时提供了 get 和 set 方法,但是,除非使用 Proxy 类,否则将无法动态地将某个方法分配给对象。

为了避免与 public 命名空间冲突,Proxy 类的方法位于 flash_proxy 命名空间中。

在 Proxy 类的方法采用 name 参数的地方,name 可以为 String 或 QName 对象(如果使用了命名空间)。

package { import flash.display.Sprite; public class ProxyExample extends Sprite { public function ProxyExample() { var arr:ProxyArray = new ProxyArray(); arr.push(1); arr.push(-2); arr.push(3); arr.push(4); arr.push("five"); trace(arr.length); // 5 trace(arr[0]); // 1 trace(arr[1]); // -2 trace(arr[2]); // 3 trace(arr[3]); // 4 trace(arr.sum()); // 6 arr.clear(); trace(arr); // (empty string) arr[0] = "zero"; trace(arr); // zero } } } import flash.utils.Proxy; import flash.utils.flash_proxy; dynamic class ProxyArray extends Proxy { private var _item:Array; public function ProxyArray() { _item = new Array(); } override flash_proxy function callProperty(methodName:*, ... args):* { var res:*; switch (methodName.toString()) { case 'clear': _item = new Array(); break; case 'sum': var sum:Number = 0; for each (var i:* in _item) { // ignore non-numeric values if (!isNaN(i)) { sum += i; } } res = sum; break; default: res = _item[methodName].apply(_item, args); break; } return res; } override flash_proxy function getProperty(name:*):* { return _item[name]; } override flash_proxy function setProperty(name:*, value:*):void { _item[name] = value; } }
callProperty 覆盖可作为函数调用的对象属性的行为。所调用方法的返回值。 name正被调用的方法的名称。 rest一个数组,指定所调用方法的参数。 覆盖可作为函数调用的对象属性的行为。在调用对象的某个方法时,将调用此方法。某些对象可作为函数调用,同时某些对象属性也可作为函数调用。 Function.call()ECMA-262 Language Specification, 3rd Edition, section 15deleteProperty 覆盖删除属性的请求。如果删除了此属性,则为 true;否则为 falseBooleanname要删除的属性的名称。 覆盖删除属性的请求。使用 delete 运算符删除属性时,将调用此方法来执行删除操作。 delete 运算符ECMA-262 Language Specification, 3rd Edition, 8.6.2.5getDescendants 覆盖 descendant 运算符的使用。descendant 运算符的结果。 name要传递到对象中并要搜索的属性的名称。 覆盖 descendant 运算符的使用。在使用 descendant 运算符时,将调用此方法。 descendant 运算符E4X SpecificationgetProperty 覆盖对属性值的任何请求。指定的属性或 undefined(如果未找到属性)。 name要检索的属性的名称。 覆盖对属性值的任何请求。如果无法找到属性,则该方法返回 undefined。有关此行为的详细信息,请参阅 ECMA-262 语言规范第三版的 8.6.2.1 小节。 get 语句ECMA-262 Language Specification, 3rd Edition, section 8.6.2.1hasProperty 覆盖请求以按名称来检查对象是否具有特定属性。如果此属性存在,则为 true;否则为 falseBooleanname要检查的属性的名称。 覆盖请求以按名称来检查对象是否具有特定属性。 Object.hasOwnProperty()ECMA-262 Language Specification, 3rd Edition, section 8.6.2.4isAttribute 检查是否还将提供的 QName 标记为属性。如果 name 的参数为同样被标记为属性的 QName,则返回 trueBooleanname要检查的属性的名称。 检查是否还将提供的 QName 标记为属性。 QName 类nextNameIndex 允许按索引编号枚举代理对象的属性。属性的索引值。 intindexint从 0 开始的索引值,枚举将从该值开始。 允许按索引编号枚举代理对象的属性。但是,无法枚举 Proxy 类自身的属性。此函数支持对对象实现 for...infor each..in 循环以检索属性索引值。

例如:

protected var _item:Array; // array of object's properties override flash_proxy function nextNameIndex (index:int):int { // initial call if (index == 0) { _item = new Array(); for (var x:~~ in _target) { _item.push(x); } } if (index < _item.length) { return index + 1; } else { return 0; } } override flash_proxy function nextName(index:int):String { return _item[index - 1]; }
Proxy.nextName()Proxy.nextValue()
nextName 允许按索引编号枚举代理对象的属性以检索属性名称。属性的名称。 Stringindexint对象属性从 0 开始的索引值。 允许按索引编号枚举代理对象的属性以检索属性名称。但是,无法枚举 Proxy 类自身的属性。此函数支持对对象实现 for...infor each..in 循环以检索所需的名称。

例如(使用 Proxy.nextNameIndex() 中的代码):

protected var _item:Array; // array of object's properties override flash_proxy function nextNameIndex (index:int):int { // initial call if (index == 0) { _item = new Array(); for (var x:~~ in _target) { _item.push(x); } } if (index < _item.length) { return index + 1; } else { return 0; } } override flash_proxy function nextName(index:int):String { return _item[index - 1]; }
Proxy.nextNameIndex()Proxy.nextValue()
nextValue 允许按索引编号枚举代理对象的属性以检索属性值。属性的值。 indexint对象属性从 0 开始的索引值。 允许按索引编号枚举代理对象的属性以检索属性值。但是,无法枚举 Proxy 类自身的属性。此函数支持对对象实现 for...infor each..in 循环以检索所需的值。

例如(使用 Proxy.nextNameIndex() 中的代码):

protected var _item:Array; // array of object's properties override flash_proxy function nextNameIndex (index:int):int { // initial call if (index == 0) { _item = new Array(); for (var x:~~ in _target) { _item.push(x); } } if (index < _item.length) { return index + 1; } else { return 0; } } override flash_proxy function nextName(index:int):String { return _item[index - 1]; }
Proxy.nextNameIndex()Proxy.nextName()
setProperty 覆盖更改属性值的调用。name要修改的属性的名称。 value要为属性设置的值。 覆盖更改属性值的调用。如果无法找到属性,此方法将创建一个具有指定名称和值的属性。 set 语句ECMA-262 Language Specification, 3rd Edition, section 8.6.2.2
ByteArray ByteArray 类提供用于优化读取、写入以及处理二进制数据的方法和属性。flash.utils:IDataInputflash.utils:IDataOutputObject ByteArray 类提供用于优化读取、写入以及处理二进制数据的方法和属性。

注意:ByteArray 类适用于需要在字节层访问数据的高级 开发人员。

内存中的数据是一个压缩字节数组(数据类型的最紧凑表示形式),但可以使用标准 [](数组访问)运算符来操作 ByteArray 类的实例。也可以使用与 URLStream 和 Socket 类中的方法相类似的方法将它作为内存中的文件进行读取和写入。

此外,还支持 zlib 压缩和解压缩,以及 Action Message Format (AMF) 对象序列化。

ByteArray 类可能的用途包括:

  • 创建用以连接到服务器的自定义协议。
  • 编写自己的 URLEncoder/URLDecoder。
  • 编写自己的 AMF/Remoting 包。
  • 通过使用数据类型优化数据的大小。
  • 在 Adobe® AIR® 中处理从文件加载的二进制数据。

以下示例使用 ByteArrayExample 类将布尔值和 pi 的双精度浮点表示形式写入字节数组。这是使用以下步骤完成的:
  1. 声明新的 ByteArray 对象实例 byteArr
  2. 写入布尔值 false 的字节等效值,然后检查长度并重新读取。
  3. 写入数学值 pi 的双精度浮点等效值。
  4. 重新读取写入字节数组的九个字节中的每一个字节。

注意:在字节上调用 trace() 时,它将输出存储于字节数组中的字节的十进制等效值。

注意如何在末尾添加一段代码以检查文件结尾错误,确保读取的字节流没有超出文件结尾。

package { import flash.display.Sprite; import flash.utils.ByteArray; import flash.errors.EOFError; public class ByteArrayExample extends Sprite { public function ByteArrayExample() { var byteArr:ByteArray = new ByteArray(); byteArr.writeBoolean(false); trace(byteArr.length); // 1 trace(byteArr[0]); // 0 byteArr.writeDouble(Math.PI); trace(byteArr.length); // 9 trace(byteArr[0]); // 0 trace(byteArr[1]); // 64 trace(byteArr[2]); // 9 trace(byteArr[3]); // 33 trace(byteArr[4]); // 251 trace(byteArr[5]); // 84 trace(byteArr[6]); // 68 trace(byteArr[7]); // 45 trace(byteArr[8]); // 24 byteArr.position = 0; try { trace(byteArr.readBoolean() == false); // true } catch(e:EOFError) { trace(e); // EOFError: Error #2030: End of file was encountered. } try { trace(byteArr.readDouble()); // 3.141592653589793 } catch(e:EOFError) { trace(e); // EOFError: Error #2030: End of file was encountered. } try { trace(byteArr.readDouble()); } catch(e:EOFError) { trace(e); // EOFError: Error #2030: End of file was encountered. } } } }
[](数组访问)Socket 类URLStream 类ByteArray 创建一个表示填充的字节数组的 ByteArray 实例,以便使用此类中的方法和属性来优化数据存储和数据流。 创建一个表示填充的字节数组的 ByteArray 实例,以便使用此类中的方法和属性来优化数据存储和数据流。 clear 清除字节数组的内容,并将 length 和 position 属性重置为 0。 清除字节数组的内容,并将 lengthposition 属性重置为 0。显式调用此方法将释放 ByteArray 实例占用的内存。 compress 压缩字节数组。algorithmStringunknown压缩时所用的压缩算法。有效值定义为 CompressionAlgorithm 类中的常量。默认情况下使用 zlib 格式。仅为 Adobe AIR 中运行的内容识别此参数。Flash Player 只支持默认的 zlib 算法,如果尝试为此参数传递一个值,Flash Player 将引发异常。调用 compress( CompressionAlgorithm.DEFLATE) 与调用 deflate() 方法效果相同。 压缩字节数组。将压缩整个字节数组。对于在 Adobe AIR 中运行的内容,可以通过传递一个值(在 CompressionAlgorithm 类中定义)作为 algorithm 参数来指定压缩算法。Flash Player 只支持默认的 zlib 算法。

在调用后,ByteArray 的 length 属性将设置为新长度。position 属性将设置为字节数组末尾。

http://www.ietf.org/rfc/rfc1950.txt 中介绍了 zlib 压缩的数据格式。

http://www.ietf.org/rfc/rfc1951.txt 中介绍了 deflate 压缩算法。

这种 deflate 压缩算法用于多种压缩格式,如 zlib、gzip、一些 zip 实现等。在使用这些压缩格式之一压缩数据时,除了存储原始数据的压缩版本之外,压缩格式数据(例如 .zip 文件)还包括元数据信息。举例来说,各种文件格式中包括的元数据的类型有文件名、文件修改日期/时间、原始文件大小、可选的注释、校验和数据等。

例如,在使用 zlib 算法压缩 ByteArray 时,将以特定的格式构建生成的 ByteArray。一些字节包含有关所压缩数据的元数据,而另一些字节包含原始 ByteArray 数据的实际压缩版本。根据 zlib 压缩数据格式规范的定义,这些字节(即包含原始数据的压缩版本的部分)使用 deflate 算法进行压缩。因此,这些字节与对原始 ByteArray 调用 compress( air. CompressionAlgorithm.DEFLATE) 所得的结果相同。但是,compress( air.CompressionAlgorithm.ZLIB) 生成的结果包括额外的元数据,而 compress(CompressionAlgorithm.DEFLATE) 生成的结果只包括原始 ByteArray 数据的压缩版本,没有任何其他内容。

若要使用 deflate 格式以 gzip 或 zip 等特定格式压缩 ByteArray 实例的数据,不能只调用 compress(CompressionAlgorithm.DEFLATE)。必须创建一个按照压缩格式规范构建的 ByteArray,包括相应的元数据以及使用 deflate 格式获取的压缩数据。同样,若要对以 gzip 或 zip 这样的格式压缩的数据进行解码,不能对该数据简单地调用 uncompress(CompressionAlgorithm.DEFLATE)。首先,必须将元数据与压缩数据分离,然后才能使用 deflate 格式对压缩数据进行解压缩。

uncompress()flash.utils.CompressionAlgorithm
deflate 使用 deflate 压缩算法压缩字节数组。 使用 deflate 压缩算法压缩字节数组。将压缩整个字节数组。

在调用后,ByteArray 的 length 属性将设置为新长度。position 属性将设置为字节数组末尾。

http://www.ietf.org/rfc/rfc1951.txt 中介绍了 deflate 压缩算法。

为了使用 deflate 格式以 gzip 或 zip 等特定格式压缩 ByteArray 实例的数据,不能只调用 deflate()。必须创建一个按照压缩格式规范构建的 ByteArray,包括相应的元数据以及使用 deflate 格式获取的压缩数据。同样,为了对以 gzip 或 zip 等格式压缩的数据进行解码,对这些数据不能只调用 inflate()。首先,必须将元数据与压缩数据分离,然后才能使用 deflate 格式对压缩数据进行解压缩。

inflate()
inflate 使用 deflate 压缩算法将字节数组解压缩。数据不是有效的压缩数据;它不是使用用于压缩的相同压缩算法进行压缩的。 IOErrorflash.errors:IOError 使用 deflate 压缩算法将字节数组解压缩。字节数组必须已经使用相同的算法进行压缩。

在调用后,ByteArray 的 length 属性将设置为新长度。position 属性将设置为 0。

http://www.ietf.org/rfc/rfc1951.txt 中介绍了 deflate 压缩算法。

为了对使用 deflate 压缩算法的格式压缩的数据(如 gzip 或 zip 格式的数据)进行解码,对包含压缩格式数据的 ByteArray 不能只调用 inflate()。首先,必须将作为压缩数据格式的一部分而包括的元数据与实际压缩数据分开。有关详细信息,请参阅 compress() 方法的描述。

deflate()
readBoolean 从字节流中读取布尔值。没有足够的数据可供读取。 EOFErrorflash.errors:EOFError如果字节不为零,则返回 true,否则返回 falseBoolean 从字节流中读取布尔值。读取单个字节,如果字节非零,则返回 true,否则返回 falsereadByte 从字节流中读取带符号的字节。没有足够的数据可供读取。 EOFErrorflash.errors:EOFError介于 -128 和 127 之间的整数。 int 从字节流中读取带符号的字节。

返回值的范围是从 -128 到 127。

readBytes 从字节流中读取 length 参数指定的数据字节数。没有足够的数据可供读取。 EOFErrorflash.errors:EOFError所提供的位移和长度的组合值大于单元的最大值。 RangeErrorRangeErrorbytesflash.utils:ByteArray要将数据读入的 ByteArray 对象。 offsetuint0bytes 中的偏移(位置),应从该位置写入读取的数据。 lengthuint0要读取的字节数。默认值 0 导致读取所有可用的数据。 从字节流中读取 length 参数指定的数据字节数。从 offset 指定的位置开始,将字节读入 bytes 参数指定的 ByteArray 对象中,并将字节写入目标 ByteArray 中。 readDouble 从字节流中读取一个 IEEE 754 双精度(64 位)浮点数。没有足够的数据可供读取。 EOFErrorflash.errors:EOFError双精度(64 位)浮点数。 Number 从字节流中读取一个 IEEE 754 双精度(64 位)浮点数。 readFloat 从字节流中读取一个 IEEE 754 单精度(32 位)浮点数。没有足够的数据可供读取。 EOFErrorflash.errors:EOFError单精度(32 位)浮点数。 Number 从字节流中读取一个 IEEE 754 单精度(32 位)浮点数。 readInt 从字节流中读取一个带符号的 32 位整数。没有足够的数据可供读取。 EOFErrorflash.errors:EOFError介于 -2147483648 和 2147483647 之间的 32 位带符号整数。 int 从字节流中读取一个带符号的 32 位整数。

返回值的范围是从 -2147483648 到 2147483647。

readMultiByte 使用指定的字符集从字节流中读取指定长度的多字节字符串。没有足够的数据可供读取。 EOFErrorflash.errors:EOFErrorUTF-8 编码的字符串。 Stringlengthuint要从字节流中读取的字节数。 charSetString表示用于解释字节的字符集的字符串。可能的字符集字符串包括 "shift-jis""cn-gb""iso-8859-1"”等。有关完整列表,请参阅支持的字符集

注意:如果当前系统无法识别 charSet 参数的值,则应用程序将使用系统的默认代码页作为字符集。例如,charSet 参数的值(如在使用 01 而不是 1myTest.readMultiByte(22, "iso-8859-01") 中)可能在您的开发系统上起作用,但在其他系统上可能不起作用。在其他系统上,应用程序将使用系统的默认代码页。

使用指定的字符集从字节流中读取指定长度的多字节字符串。
readObject 从字节数组中读取一个以 AMF 序列化格式进行编码的对象。没有足够的数据可供读取。 EOFErrorflash.errors:EOFError反序列化的对象。 从字节数组中读取一个以 AMF 序列化格式进行编码的对象。 flash.net.registerClassAlias()readShort 从字节流中读取一个带符号的 16 位整数。没有足够的数据可供读取。 EOFErrorflash.errors:EOFError介于 -32768 和 32767 之间的 16 位带符号整数。 int 从字节流中读取一个带符号的 16 位整数。

返回值的范围是从 -32768 到 32767。

readUTFBytes 从字节流中读取一个由 length 参数指定的 UTF-8 字节序列,并返回一个字符串。没有足够的数据可供读取。 EOFErrorflash.errors:EOFError由指定长度的 UTF-8 字节组成的字符串。 Stringlengthuint指明 UTF-8 字节长度的无符号短整型数。 从字节流中读取一个由 length 参数指定的 UTF-8 字节序列,并返回一个字符串。 readUTF 从字节流中读取一个 UTF-8 字符串。没有足够的数据可供读取。 EOFErrorflash.errors:EOFErrorUTF-8 编码的字符串。 String 从字节流中读取一个 UTF-8 字符串。假定字符串的前缀是无符号的短整型(以字节表示长度)。 flash.utils.IDataInput.readUTF()readUnsignedByte 从字节流中读取无符号的字节。没有足够的数据可供读取。 EOFErrorflash.errors:EOFError介于 0 和 255 之间的 32 位无符号整数。 uint 从字节流中读取无符号的字节。

返回值的范围是从 0 到 255。

readUnsignedInt 从字节流中读取一个无符号的 32 位整数。没有足够的数据可供读取。 EOFErrorflash.errors:EOFError介于 0 和 4294967295 之间的 32 位无符号整数。 uint 从字节流中读取一个无符号的 32 位整数。

返回值的范围是从 0 到 4294967295。

readUnsignedShort 从字节流中读取一个无符号的 16 位整数。没有足够的数据可供读取。 EOFErrorflash.errors:EOFError介于 0 和 65535 之间的 16 位无符号整数。 uint 从字节流中读取一个无符号的 16 位整数。

返回值的范围是从 0 到 65535。

toString 将字节数组转换为字符串。字节数组的字符串表示形式。 String 将字节数组转换为字符串。如果数组中的数据以 Unicode 字节顺序标记开头,应用程序在将其转换为字符串时将保持该标记。如果 System.useCodePage 设置为 true,应用程序在转换时会将数组中的数据视为处于当前系统代码页中。 uncompress 解压缩字节数组。数据不是有效的压缩数据;它不是使用用于压缩的相同压缩算法进行压缩的。 IOErrorflash.errors:IOErroralgorithmStringunknown解压缩时要使用的压缩算法。它必须是用于压缩该数据的相同的压缩算法。有效值定义为 CompressionAlgorithm 类中的常量。默认情况下使用 zlib 格式。仅为 Adobe AIR 中运行的内容识别此参数。Flash Player 只支持默认的 zlib 算法,如果尝试为此参数传递一个值,Flash Player 将引发异常。 解压缩字节数组。对于在 Adobe AIR 中运行的内容,可以通过传递一个值(在 CompressionAlgorithm 类中定义)作为 algorithm 参数来指定压缩算法。字节数组必须已经使用相同的算法进行压缩。Flash Player 只支持默认的 zlib 算法。

在调用后,ByteArray 的 length 属性将设置为新长度。position 属性将设置为 0。

http://www.ietf.org/rfc/rfc1950.txt 中介绍了 zlib 压缩的数据格式。

http://www.ietf.org/rfc/rfc1951.txt 中介绍了 deflate 压缩算法。

在对使用 deflate 压缩算法的格式压缩的数据(如采用 gzip 或 zip 格式的数据)进行解码时,对包含压缩格式数据的 ByteArray 调用 uncompress(CompressionAlgorithm.DEFLATE) 将不起作用。首先,必须将作为压缩数据格式的一部分而包括的元数据与实际压缩数据分开。有关详细信息,请参阅 compress() 方法的描述。

compress()flash.utils.CompressionAlgorithm
writeBoolean 写入布尔值。valueBoolean确定写入哪个字节的布尔值。如果该参数为 true,则该方法写入 1;如果该参数为 false,则该方法写入 0。 写入布尔值。根据 value 参数写入单个字节。如果为 true,则写入 1,如果为 false,则写入 0。 writeByte 在字节流中写入一个字节。valueint一个 32 位整数。低 8 位将被写入字节流。 在字节流中写入一个字节。

使用参数的低 8 位。忽略高 24 位。

writeBytes 将来自指定字节数组、字节数、起始偏移(基于零的索引)字节的长度字节数序列写入字节流。bytesflash.utils:ByteArrayByteArray 对象。 offsetuint0从 0 开始的索引,表示在数组中开始写入的位置。 lengthuint0一个无符号整数,表示在缓冲区中的写入范围。 将指定字节数组 bytes(起始偏移量为 offset,从零开始的索引)中包含 length 个字节的字节序列写入字节流。

如果省略 length 参数,则使用默认长度 0;该方法将从 offset 开始写入整个缓冲区。如果还省略了 offset 参数,则写入整个缓冲区。

如果 offsetlength 超出范围,它们将被锁定到 bytes 数组的开头和结尾。

writeDouble 在字节流中写入一个 IEEE 754 双精度(64 位)浮点数。valueNumber双精度(64 位)浮点数。 在字节流中写入一个 IEEE 754 双精度(64 位)浮点数。 writeFloat 在字节流中写入一个 IEEE 754 单精度(32 位)浮点数。valueNumber单精度(32 位)浮点数。 在字节流中写入一个 IEEE 754 单精度(32 位)浮点数。 writeInt 在字节流中写入一个带符号的 32 位整数。valueint要写入字节流的整数。 在字节流中写入一个带符号的 32 位整数。 writeMultiByte 使用指定的字符集将多字节字符串写入字节流。valueString要写入的字符串值。 charSetString表示要使用的字符集的字符串。可能的字符集字符串包括 "shift-jis""cn-gb""iso-8859-1"”等。有关完整列表,请参阅支持的字符集 使用指定的字符集将多字节字符串写入字节流。 writeObject 将对象以 AMF 序列化格式写入字节数组。object要序列化的对象。 将对象以 AMF 序列化格式写入字节数组。 flash.net.registerClassAlias()writeShort 在字节流中写入一个 16 位整数。valueint32 位整数,该整数的低 16 位将被写入字节流。 在字节流中写入一个 16 位整数。使用参数的低 16 位。忽略高 16 位。 writeUTFBytes 将 UTF-8 字符串写入字节流。valueString要写入的字符串值。 将 UTF-8 字符串写入字节流。类似于 writeUTF() 方法,但 writeUTFBytes() 不使用 16 位长度的词为字符串添加前缀。 writeUTF 将 UTF-8 字符串写入字节流。如果长度大于 65535。 RangeErrorRangeErrorvalueString要写入的字符串值。 将 UTF-8 字符串写入字节流。先写入以字节表示的 UTF-8 字符串长度(作为 16 位整数),然后写入表示字符串字符的字节。 writeUnsignedInt 在字节流中写入一个无符号的 32 位整数。valueuint要写入字节流的无符号整数。 在字节流中写入一个无符号的 32 位整数。 bytesAvailable 可从字节数组的当前位置到数组末尾读取的数据的字节数。uint 可从字节数组的当前位置到数组末尾读取的数据的字节数。

每次访问 ByteArray 对象时,将 bytesAvailable 属性与读取方法结合使用,以确保读取有效的数据。

defaultObjectEncoding 表示用于新 ByteArray 实例的 ByteArray 类的默认对象编码。uint 表示用于新 ByteArray 实例的 ByteArray 类的默认对象编码。在创建新的 ByteArray 实例时,该实例上的编码以 defaultObjectEncoding 的值开头。defaultObjectEncoding 属性被初始化为 ObjectEncoding.AMF3

将对象写入二进制数据或从中读取对象时,将使用 objectEncoding 值来确定应使用 ActionScript 3.0、ActionScript2.0 还是 ActionScript 1.0 格式。该值为 ObjectEncoding 类中的常数。

ObjectEncoding 类flash.utils.ByteArray.objectEncoding
endian 更改或读取数据的字节顺序;Endian.BIG_ENDIAN 或 Endian.LITTLE_ENDIAN。String 更改或读取数据的字节顺序;Endian.BIG_ENDIANEndian.LITTLE_ENDIANEndian 类length ByteArray 对象的长度(以字节为单位)。uint ByteArray 对象的长度(以字节为单位)。

如果将长度设置为大于当前长度的值,则用零填充字节数组的右侧。

如果将长度设置为小于当前长度的值,将会截断该字节数组。

objectEncoding 用于确定在写入或读取 ByteArray 实例时应使用 ActionScript 3.0、ActionScript 2.0 还是 ActionScript 1.0 格式。uint 用于确定在写入或读取 ByteArray 实例时应使用 ActionScript 3.0、ActionScript 2.0 还是 ActionScript 1.0 格式。该值为 ObjectEncoding 类中的常数。 ObjectEncoding 类flash.utils.ByteArray.defaultObjectEncodingposition 将文件指针的当前位置(以字节为单位)移动或返回到 ByteArray 对象中。uint 将文件指针的当前位置(以字节为单位)移动或返回到 ByteArray 对象中。下一次调用读取方法时将在此位置开始读取,或者下一次调用写入方法时将在此位置开始写入。
IDataOutput IDataOutput 接口提供一组用于写入二进制数据的方法。 IDataOutput 接口提供一组用于写入二进制数据的方法。此接口是读取二进制数据的 IDataInput 接口的 I/O 对应接口。IDataOutput 接口是由 FileStream、Socket 和 ByteArray 类实现的。

默认情况下,所有 IDataInput 和 IDataOutput 操作均为“bigEndian”(序列中的最高有效字节存储在最低或第一个存储地址),而且都不分块。

符号扩展名仅在读取数据时有效,写入数据时无效。因此,无需单独的写入方法就可以使用 IDataInput.readUnsignedByte()IDataInput.readUnsignedShort()。换言之:

  • IDataOutput.writeByte()IDataInput.readUnsignedByte()IDataInput.readByte() 一起使用。
  • IDataOutput.writeShort()IDataInput.readUnsignedShort()IDataInput.readShort() 一起使用。
以下示例使用 DataOutputExample 类将布尔值和 pi 的双精度浮点表示形式写入字节数组。这是使用以下步骤完成的:
  1. 声明新的 ByteArray 对象实例 byteArr
  2. 写入布尔值 false 的字节等效值和数学值 pi 的双精度浮点等效值。
  3. 重新读取布尔值和双精度浮点数。

注意如何在末尾添加一段代码以检查文件结尾错误,确保读取的字节流没有超出文件结尾。

package { import flash.display.Sprite; import flash.utils.ByteArray; import flash.errors.EOFError; public class DataOutputExample extends Sprite { public function DataOutputExample() { var byteArr:ByteArray = new ByteArray(); byteArr.writeBoolean(false); byteArr.writeDouble(Math.PI); byteArr.position = 0; try { trace(byteArr.readBoolean()); // false } catch(e:EOFError) { trace(e); // EOFError: Error #2030: End of file was encountered. } try { trace(byteArr.readDouble()); // 3.141592653589793 } catch(e:EOFError) { trace(e); // EOFError: Error #2030: End of file was encountered. } try { trace(byteArr.readDouble()); } catch(e:EOFError) { trace(e); // EOFError: Error #2030: End of file was encountered. } } } }
IDataInput interfaceendianFileStream 类Socket 类URLStream 类ByteArray 类writeBoolean 写入布尔值。valueBoolean确定写入哪个字节的布尔值。如果该参数为 true,则写入 1;如果为 false,则写入 0。 写入布尔值。根据 value 参数写入单个字节。如果为 true,则写入 1,如果为 false,则写入 0。 writeByte 写入一个字节。valueint一个整型字节值。 写入一个字节。使用了该参数的低 8 位;忽略了高 24 位。 writeBytes 在指定的字节数组 bytes 中,从 offset(使用从零开始的索引)指定的字节开始,向文件流、字节流或字节数组中写入一个长度由 length 指定的字节序列。bytesflash.utils:ByteArray要写入的字节数组。 offsetuint0从零开始的索引,指定在数组中开始写入的位置。 lengthuint0一个无符号整数,指定在缓冲区中的写入范围。 在指定的字节数组 bytes 中,从 offset(使用从零开始的索引)指定的字节开始,向文件流、字节流或字节数组中写入一个长度由 length 指定的字节序列。

如果省略 length 参数,则使用默认长度 0 并从 offset 开始写入整个缓冲区。如果还省略了 offset 参数,则写入整个缓冲区。

如果 offsetlength 参数超出范围,它们将被锁定到 bytes 数组的开头和结尾。

writeDouble 写入 IEEE 754 双精度(64 位)浮点数。valueNumber双精度(64 位)浮点数。 写入 IEEE 754 双精度(64 位)浮点数。 writeFloat 写入 IEEE 754 单精度(32 位)浮点数。valueNumber单精度(32 位)浮点数。 写入 IEEE 754 单精度(32 位)浮点数。 writeInt 写入一个带符号的 32 位整数。valueint一个带符号的整型字节值。 写入一个带符号的 32 位整数。 writeMultiByte 使用指定的字符集将多字节字符串写入文件流、字节流或字节数组中。valueString要写入的字符串值。 charSetString表示要使用的字符集的字符串。可能的字符集字符串包括 "shift-jis""cn-gb""iso-8859-1"”等。有关完整列表,请参阅支持的字符集 使用指定的字符集将多字节字符串写入文件流、字节流或字节数组中。 writeObject 以 AMF 序列化格式将对象写入文件流、字节流或字节数组中。object要进行序列化处理的对象。 以 AMF 序列化格式将对象写入文件流、字节流或字节数组中。 objectEncodingflash.net.registerClassAlias()writeShort 写入一个 16 位整数。valueint一个整型字节值。 写入一个 16 位整数。使用了该参数的低 16 位;忽略了高 16 位。 writeUTFBytes 写入一个 UTF-8 字符串。valueString要写入的字符串值。 写入一个 UTF-8 字符串。类似于 writeUTF(),但不使用 16 位长度的词为字符串添加前缀。 writeUTF 将 UTF-8 字符串写入文件流、字节流或字节数组中。如果长度大于 65535。 RangeErrorRangeErrorvalueString要写入的字符串值。 将 UTF-8 字符串写入文件流、字节流或字节数组中。先写入以字节表示的 UTF-8 字符串长度(作为 16 位整数),然后写入表示字符串字符的字节。 writeUnsignedInt 写入一个无符号的 32 位整数。valueuint一个无符号的整型字节值。 写入一个无符号的 32 位整数。 endian 数据的字节顺序:为 Endian 类中的 BIG_ENDIAN 或 LITTLE_ENDIAN 常量。String 数据的字节顺序:为 Endian 类中的 BIG_ENDIANLITTLE_ENDIAN 常量。 Endian 类objectEncoding 用于确定在使用 writeObject() 方法写入或读取二进制数据时是使用 AMF3 格式还是 AMF0 格式。uint 用于确定在使用 writeObject() 方法写入或读取二进制数据时是使用 AMF3 格式还是 AMF0 格式。该值为 ObjectEncoding 类中的常数。 IDataInput.readObject()writeObject()ObjectEncoding 类
Endian Endian 类中包含一些值,它们表示用于表示多字节数字的字节顺序。Object Endian 类中包含一些值,它们表示用于表示多字节数字的字节顺序。字节顺序为 bigEndian(最高有效字节位于最前)或 littleEndian(最低有效字节位于最前)。

Flash Player 或 Adobe® AIR™ 中的内容可以通过使用服务器的二进制协议直接与该服务器连接。某些服务器使用 bigEndian 字节顺序,某些服务器则使用 littleEndian 字节顺序。Internet 上的大多数服务器使用 bigEndian 字节顺序,因为“网络字节顺序”为 bigEndian。littleEndian 字节顺序很常用,因为 Intel x86 体系结构使用该字节顺序。使用与收发数据的服务器的协议相匹配的 Endian 字节顺序。

flash.utils.ByteArray.endianflash.filesystem.FileStream.endianflash.utils.IDataInput.endianflash.utils.IDataOutput.endianflash.net.Socket.endianflash.net.URLStream.endianBIG_ENDIAN 表示多字节数字的最高有效字节位于字节序列的最前面。bigEndianString 表示多字节数字的最高有效字节位于字节序列的最前面。

十六进制数字 0x12345678 包含 4 个字节(每个字节包含 2 个十六进制数字)。最高有效字节为 0x12。最低有效字节为 0x78。(对于等效的十进制数字 305419896,最高有效数字是 3,最低有效数字是 6)。

使用 bigEndian 字节顺序(最高有效字节位于最前)的流将写入:

	 12 34 56 78
	 
LITTLE_ENDIAN 表示多字节数字的最低有效字节位于字节序列的最前面。littleEndianString 表示多字节数字的最低有效字节位于字节序列的最前面。

十六进制数字 0x12345678 包含 4 个字节(每个字节包含 2 个十六进制数字)。最高有效字节为 0x12。最低有效字节为 0x78。(对于等效的十进制数字 305419896,最高有效数字是 3,最低有效数字是 6)。

使用 littleEndian 字节顺序(最低有效字节位于最前)的流将写入:

	 78 56 34 12
	 
IExternalizable 将类编码到数据流中时,IExternalizable 接口提供对其序列化的控制。 将类编码到数据流中时,IExternalizable 接口提供对其序列化的控制。IExternalizable 接口的 writeExternal()readExternal() 方法是由一个类实现的,以便允许为对象及其超类型自定义数据流的内容和格式(但不是类名或类型)。每个单独的类都必须序列化并重新构建其实例的状态。这些方法必须与超类型相称才能保存其状态。这些方法取代了本机的 Action Message Format (AMF) 序列化行为。

如果某个类既没有实现 IExternalizable 接口,也没有从实现该接口的类继承,则将仅使用公共成员的默认机制对该类的实例进行序列化。因此,类的私有成员、内部成员和受保护的成员将不可用。

要序列化私有成员,类必须使用 IExternalizable 接口。例如,以下类将不会序列化其任何成员,因为这些成员都是私有成员:

class Example { private var one:int; private var two:int; }

但是,如果实现了 IExternalizable 接口,则可以将类的私有成员写入数据流或从数据流中读取类的私有成员,如下所示:

class Example implement IExternalizable { private var one:int; private var two:int; public function writeExternal(output:IDataOutput) { output.writeInt(one); output.writeInt(two); } public function readExternal(input:IDataInput) { one = input.readInt(); two = input.readInt(); } }

注意:如果某个类实现了 IExternalizable,则默认序列化不再适用于该类的实例。如果该类从超类继承公共成员,还必须小心地管理这些成员。

如果实现 IExternalizable 的某个类的子类有自己的私有成员,则该子类必须覆盖 IExternalizable 的方法,如下所示:

public class Base implements IExternalizable { private var one:Boolean; public function writeExternal(output:IDataOutput):void { output.writeBoolean(one); } public function readExternal(input:IDataInput):void { one = input.readBoolean(); } } public class Example extends Base { private var one:String; public override function writeExternal(output:IDataOutput):void { super.writeExternal(output); output.writeUTF(one); } public override function readExternal(input:IDataInput):void { super.readExternal(input); one = input.readUTF(); } }

在将数据写入数据流之前,也可以使用 IExternalizable 接口来压缩数据。例如:

class Example implements IExternalizable { public var one:Boolean; public var two:Boolean; public var three:Boolean; public var four:Boolean; public var five:Boolean; public var six:Boolean; public var seven:Boolean; public var eight:Boolean; public function writeExternal(output:IDataOutput) { var flag:int = 0; if (one) flag |= 1; if (two) flag |= 2; if (three) flag |= 4; if (four) flag |= 8; if (five) flag |= 16; if (six) flag |= 32; if (seven) flag |= 64; if (eight) flag |= 128; output.writeByte(flag); } public function readExternal(input:IDataInput) { var flag:int = input.readByte(); one = (flag & 1) != 0; two = (flag & 2) != 0; three = (flag & 4) != 0; four = (flag & 8) != 0; five = (flag & 16) != 0; six = (flag & 32) != 0; seven = (flag & 64) != 0; eight = (flag & 128) != 0; } }
flash.net.ObjectEncodingreadExternal 类实现此方法,以便通过调用 IDataInput 接口的方法,将其自身从数据流中解码。inputflash.utils:IDataInput实现 IDataInput 接口的类的名称。 类实现此方法,以便通过调用 IDataInput 接口的方法,将其自身从数据流中解码。此方法必须读取与 writeExternal() 方法所写入值处于同一序列中并且类型相同的值。 writeExternal 类实现此方法,以便通过调用 IDataOutput 接口的方法,将其自身编码到数据流中。outputflash.utils:IDataOutput实现 IDataOutput 接口的类的名称。 类实现此方法,以便通过调用 IDataOutput 接口的方法,将其自身编码到数据流中。
describeType 生成描述 ActionScript 对象(命名为方法的参数)的 XML 对象。一个 XML 对象,包含有关作为参数传入的对象的详细信息。它提供有关对象的以下信息:
  • 对象的类
  • 类的属性
  • 从类到其基类的继承树
  • 类实现的接口
  • 类的已声明实例属性
  • 类的已声明静态属性
  • 类的实例方法
  • 类的静态方法
  • (对于类的每个方法)名称、参数的数量、返回类型和参数类型

注意: describeType() 只显示公共属性和方法,而不会显示私有、在包内部或在自定义命名空间中的属性和方法。

XML
value需要类型说明的对象。可以将任何 ActionScript 值传递给此方法,包括所有可用的 ActionScript 类型、对象实例、原始类型(如 uint)和类对象。
生成描述 ActionScript 对象(命名为方法的参数)的 XML 对象。此方法实现 ActionScript 语言的反射编程概念。

如果 value 参数是类型的实例,则返回的 XML 对象包括该类型的所有实例属性,但不包括任何静态属性。可以在解析 XML 对象时检查此条件,方法是检查 <type> 标签的 isStatic 属性的值,该值在 value 参数是类型的实例时为 false

要获取某个类型的静态属性,请为 value 参数传递该类型本身。返回的 XML 对象不仅仅包括类型的静态属性,而且还包括它的所有实例属性。实例属性嵌套在名为 <factory> 的标签内,从而与静态属性区分开来。在这种情况下,<type> 标签的 isStatic 属性为 true

注意:如果只需要遍历某个对象的继承层次结构,而不需要 describeType() 提供的其他信息,请改用 getQualifiedClassName()getQualifiedSuperclassName() 函数。

下表描述了由 describeType() 生成的 XML 对象的某些标签和属性(返回的所有类和接口名称均采用完全限定的格式):

标签属性说明<type> XML 对象的根标签。 nameActionScript 对象的数据类型的名称。 baseActionScript 对象的定义类的直接超类。如果 ActionScript 对象是类对象,则值为 Class isDynamic如果 ActionScript 对象的定义类是动态的,则为 true;否则为 false。如果 ActionScript 对象是类对象,则值为 true,因为 Class 类是动态的。 isFinal如果 ActionScript 对象的定义类是最终类,则为 true;否则为 false isStatic如果 ActionScript 对象是类对象或构造函数,则为 true;否则为 false。此属性之所以名为 isStatic,原因是:如果此属性为 true,则未嵌套在 factory 标记内的任何标签都是静态的。<extendsClass> ActionScript 对象的定义类的每个超类都有一个单独的 extendsClass 标签。 typeActionScript 对象的定义类扩展的超类的名称。<implementsInterface> ActionScript 对象的定义类或其任何超类实现的每个接口都有一个单独的 implementsInterface 标签。 typeActionScript 对象的定义类实现的接口的名称。<accessor> 存取器是 getter 和 setter 函数定义的一个属性。 name存取器的名称。 access属性的访问权限。可能的值包括 readonlywriteonlyreadwrite type属性的数据类型。 declaredBy包含关联的 getter 或 setter 函数的类。<constant> 常量是用 const 语句定义的一个属性。 name常量的名称。 type常量的数据类型。<method> 方法是作为类定义的一部分声明的函数。 name方法的名称。 declaredBy包含方法定义的类。 returnType方法的返回值的数据类型。<parameter> 方法定义的每个参数都有一个单独的 parameter 标签。此标签始终嵌套在 <method> 标签内。 index一个数字,对应于参数在方法的参数列表中出现的顺序。第一个参数的值为 1。 type参数的数据类型。 optional如果参数是可选参数,则为 true;否则为 false<variable> 变量是用 var 语句定义的一个属性。 name变量的名称。 type变量的数据类型。<factory> 如果 ActionScript 对象是类对象或构造函数,则所有实例属性和方法均嵌套在此标签内。如果 <type> 标签的 isStatic 属性为 true,则未嵌套在 <factory> 标签内的所有属性和方法都是静态的。只有在 ActionScript 对象是类对象或构造函数时,此标签才会出现。
package { import flash.display.Sprite; import flash.utils.describeType; public class DescribeTypeExample extends Sprite { public function DescribeTypeExample() { var child:Sprite = new Sprite(); var description:XML = describeType(child); trace(description..accessor.@name.toXMLString()); } } }
getQualifiedClassName()getQualifiedSuperclassName()
escapeMultiByte 返回编码为 UTF-8 或系统代码页的输入字符串的转义副本,具体取决于 System.useCodePage 的值。输入字符串的转义副本。如果 System.useCodePage 为 true,则转义字符串采用系统代码页编码。如果 System.useCodePage 为 false,则转义字符串采用 UTF-8 编码。例如,如果 System.useCodePage 为 false,输入字符串“Crüe”在所有系统上都将被转义为“Cr%C3%BCe”。如果 system.useCodePage 为 true,并且系统使用拉丁语代码页,则“Crüe”将被转义为“Cr%FCe”。如果系统使用不包含字母“ü”的非拉丁语代码页,结果将可能为“Cr?e”。如果在 System.useCodePage 设置为 true 的情况下对“Cr%C3%BCe”进行反向转义,则在不同的系统上会生成不同的错误结果,比如在拉丁语系统上会生成“Crüe”。同样,在 System.useCodePage 设置为 false 的情况下对“Cr%FCe”进行反向转义可能会生成“Cre”、“Cr?e”或其他变体,具体取决于系统的代码页。 StringvalueString要转义的字符串。 返回编码为 UTF-8 或系统代码页的输入字符串的转义副本,具体取决于 System.useCodePage 的值。使用 System.useCodePage 允许运行时访问在本地代码页中编码的旧内容,但仅在使用此旧代码页的系统上。例如,在使用日语默认代码页的操作系统中,只能正确转义和反向转义以 Shift-JIS 编码的日语数据。 getDefinitionByName 返回 name 参数指定的类的类对象引用。不存在具有指定名称的公共定义。 ReferenceErrorReferenceError返回 name 参数指定的类的类对象引用。 ObjectnameString类的名称。 返回 name 参数指定的类的类对象引用。 以下示例使用 GetDefinitionByNameExample 类在舞台上创建一个橙色的正方形。这是使用以下步骤完成的:
  1. 声明代表橙色背景颜色和 80 像素大小的变量,这些变量稍后将用于绘制正方形。
  2. 在构造函数内,将 Class 类型的变量 ClassReference 赋予 Sprite。
  3. 对名为 instance 的 ClassReference 的实例进行实例化。
  4. 由于 instance 按引用是 Sprite 对象,因此可以使用可用于 Sprite 的方法绘制正方形并将其添加到显示列表。
package { import flash.display.DisplayObject; import flash.display.Sprite; import flash.utils.getDefinitionByName; public class GetDefinitionByNameExample extends Sprite { private var bgColor:uint = 0xFFCC00; private var size:uint = 80; public function GetDefinitionByNameExample() { var ClassReference:Class = getDefinitionByName("flash.display.Sprite") as Class; var instance:Object = new ClassReference(); instance.graphics.beginFill(bgColor); instance.graphics.drawRect(0, 0, size, size); instance.graphics.endFill(); addChild(DisplayObject(instance)); } } }
getQualifiedClassName 返回对象的完全限定类名。包含完全限定类名称的字符串。 Stringvalue需要完全限定类名称的对象。可以将任何 ActionScript 值传递给此方法,包括所有可用的 ActionScript 类型、对象实例、原始类型(如 uint)和类对象。 返回对象的完全限定类名。 describeType()getQualifiedSuperclassName()getQualifiedSuperclassName 返回 value 参数指定的对象的基类的完全限定类名。完全限定的基类名称,或 null(如果不存在基类名称)。 Stringvalue任何值。 返回 value 参数指定的对象的基类的完全限定类名。此函数检索基类名称的速度比 describeType() 快,但提供的信息不如 describeType() 全面。

使用此函数检索了类的名称后,可以用 getDefinitionByName() 函数将类名称转换为类引用。

注意:此函数将本身局限于实例层次结构,而 describeType() 函数则使用类对象层次结构(如果 value 参数是数据类型)。如果在数据类型上调用 describeType(),将会基于类对象层次结构(其中所有类对象均继承自 Class)返回超类。但是,getQualifiedSuperclassName() 函数会忽略类对象层次结构,并基于较普通的实例层次结构返回超类。例如,调用 getQualifiedSuperclassName(String) 将会返回 Object,尽管从技术角度来说 String 类对象继承自 Class。换言之,不管使用的是类型的实例还是类型本身,结果都是相同的。

describeType()getDefinitionByName()getQualifiedClassName()
getTimer 用于计算相对时间。自初始化运行时(处理 ActionScript 2.0 时)或启动虚拟计算机(处理 ActionScript 3.0 时)以来经过的毫秒数。如果运行时开始播放一个 SWF 文件,稍后再加载另一个 SWF 文件,则返回值相对于加载第一个 SWF 文件的时间。 int 用于计算相对时间。对于处理 ActionScript 3.0 的 Flash 运行时,此方法返回自为 ActionScript 3.0 (AVM2) 启动 Flash 运行时虚拟计算机以来经过的毫秒数。对于处理 ActionScript 2.0 的 Flash 运行时,此方法返回自 Flash 运行时开始初始化以来经过的毫秒数。Flash 运行时使用两台虚拟机处理 ActionScript。AVM1 是用于运行 ActionScript 1.0 和 2.0 的 ActionScript 虚拟机。AVM2 是用于运行 ActionScript 3.0 的 ActionScript 虚拟机。AVM1 的 getTimer() 方法行为与 AVM2 的行为不同。

关于日历日期(时间戳),请参阅 Date 对象。

以下示例使用 GetTimerExample 类获取和打印自运行时初始化后的毫秒数。 package { import flash.utils.getTimer; import flash.display.Sprite; public class GetTimerExample extends Sprite { public function GetTimerExample() { var duration:uint = getTimer(); trace("duration: " + duration); } } }
flash.display.AVM1MovieDate 类
unescapeMultiByte 返回依据系统代码页或 UTF-8 解码的输入字符串的反向转义副本,具体取决于 System.useCodePage 的值。输入字符串的反向转义副本。如果 System.useCodePage 为 true,则依据系统代码页对转义字符串进行解码。如果 System.useCodePage 为 false,则依据 UTF-8 对转义字符串进行解码。例如,如果输入字符串为“Crüe”并且 System.useCodePage 为 false,则在所有系统上的结果都是“Crüe”。如果 System.useCodePage 为 true 且输入字符串为“Cr%FCe”,并且系统使用拉丁语代码页,则结果将也是“Crüe”。如果在 System.useCodePage 设置为 true 的情况下对“Cr%C3%BCe”进行反向转义,则在不同的系统上会生成不同的错误结果,比如在拉丁语系统上会生成“Crüe”。同样,在 System.useCodePage 设置为 false 的情况下对“Cr%FCe”进行反向转义可能会生成“Cre”、“Cr?e”或其他变体,具体取决于系统的代码页。 StringvalueString要反向转义的转义字符串。 返回依据系统代码页或 UTF-8 解码的输入字符串的反向转义副本,具体取决于 System.useCodePage 的值。使用 System.useCodePage 允许运行时访问在本地代码页中编码的旧内容,但仅在使用此旧代码页的系统上。例如,在使用日语默认代码页的操作系统中,只能正确转义和反向转义以 Shift-JIS 编码的日语数据。 clearInterval 取消指定的 setInterval() 调用。iduint设置为变量的 setInterval() 调用的 ID,如以下代码中所示: 取消指定的 setInterval() 调用。 以下示例使用 setInterval() 方法创建一个计时间隔,以 1 秒的固定间隔调用 myRepeatingFunction() 方法。

每次调用 myRepeatingFunction 方法都会递增 counter 属性,当该属性等于 stopCount 属性时,调用 clearInterval() 方法(使用属性 intervalId 进行调用,该属性是对前面创建的间隔的引用 ID)。

package { import flash.display.Sprite; import flash.utils.*; public class ClearIntervalExample extends Sprite { private var intervalDuration:Number = 1000; // duration between intervals, in milliseconds private var intervalId:uint; private var counter:uint = 0; private var stopCount:uint = 3; public function ClearIntervalExample() { intervalId = setInterval(myRepeatingFunction, intervalDuration, "Hello", "World"); } public function myRepeatingFunction():void { trace(arguments[0] + " " + arguments[1]); counter++; if(counter == stopCount) { trace("Clearing Interval"); clearInterval(intervalId); } } } }
setInterval()
clearTimeout 取消指定的 setTimeout() 调用。iduint设置为变量的 setTimeout() 调用的 ID,如以下代码中所示: 取消指定的 setTimeout() 调用。 以下示例使用 setTimeout() 方法在指定的延迟期之后调用另一个方法。

创建一个计数到一百万的循环。如果系统处理此请求的速度比一秒钟后到期的速度还要快,则 clearTimeout() 将删除此 setTimeout() 请求且将不会调用 myDelayedFunction()

package { import flash.display.Sprite; import flash.utils.*; public class ClearTimeoutExample extends Sprite { private var delay:Number = 1000; // delay before calling myDelayedFunction private var intervalId:uint; private var count:uint = 1000000; public function ClearTimeoutExample() { intervalId = setTimeout(myDelayedFunction, delay); startCounting(); } public function startCounting():void { var i:uint = 0; do { if(i == count-1) { clearTimeout(intervalId); trace("Your computer can count to " + count + " in less than " + delay/1000 + " seconds."); } i++; } while(i < count) } public function myDelayedFunction():void { trace("Time expired."); } } }
setTimeout()
setInterval 以指定的间隔(以毫秒为单位)运行函数。超时进程的唯一数字标识符。使用此标识符可通过调用 clearInterval() 方法取消进程。 uintclosureFunction要执行的函数的名称。不要包括引号或圆括号,并且不要指定要调用的函数的参数。例如,使用 functionName,而不要使用 functionName()functionName(param)delayNumber间隔(以毫秒为单位)。 arguments传递给 closure 函数的可选参数列表。 以指定的间隔(以毫秒为单位)运行函数。

作为使用 setInterval() 方法的替代方法,请考虑创建一个 Timer 对象,带有指定的间隔,并使用 0 作为 repeatCount 参数(这样可将计时器设置为无限制重复)。

如果打算使用 clearInterval() 方法取消 setInterval() 调用,请确保将 setInterval() 调用分配给一个变量(clearInterval() 函数稍后将引用该变量)。如果不通过调用 clearInterval() 函数取消 setInterval() 调用,则不会将包含 setTimeout 闭包函数的对象作为垃圾回收。

以下示例使用 setInterval() 方法创建一个计时间隔,以 1 秒的固定间隔调用 myRepeatingFunction() 方法。 package { import flash.display.Sprite; import flash.utils.*; public class SetIntervalExample extends Sprite { private var intervalDuration:Number = 1000; // duration between intervals, in milliseconds public function SetIntervalExample() { var intervalId:uint = setInterval(myRepeatingFunction, intervalDuration, "Hello", "World"); } public function myRepeatingFunction():void { trace(arguments[0] + " " + arguments[1]); } } }
clearInterval()
setTimeout 在指定的延迟(以毫秒为单位)后运行指定的函数。超时进程的唯一数字标识符。使用此标识符可通过调用 clearTimeout() 方法取消进程。 uintclosureFunction要执行的函数的名称。不要包括引号或圆括号,并且不要指定要调用的函数的参数。例如,使用 functionName,而不要使用 functionName()functionName(param)delayNumber执行函数之前的延迟时间(以毫秒为单位)。 arguments传递给 closure 函数的可选参数列表。 在指定的延迟(以毫秒为单位)后运行指定的函数。

作为使用此方法的替代方法,请考虑创建一个 Timer 对象,带有指定的间隔,并使用 1 作为 repeatCount 参数(这样可将计时器设置为只运行一次)。

如果打算使用 clearTimeout() 方法取消 setTimeout() 调用,请确保将 setTimeout() 调用分配给一个变量(clearTimeout() 函数稍后将引用该变量)。如果不通过调用 clearTimeout() 函数取消 setTimeout() 调用,则不会将包含设置的超时 closure 函数的对象作为垃圾回收。

以下示例使用 setTimeout() 方法在指定的延迟期之后调用另一个方法。 package { import flash.display.Sprite; import flash.utils.*; public class SetTimeoutExample extends Sprite { private var delay:Number = 1000; // delay before calling myDelayedFunction public function SetTimeoutExample() { var intervalId:uint = setTimeout(myDelayedFunction, delay, "Hello", "World"); } public function myDelayedFunction():void { trace(arguments[0] + " " + arguments[1]); } } }
clearTimeout()
Timer Timer 类是计时器的接口,它使您能按指定的时间序列运行代码。flash.events:EventDispatcher Timer 类是计时器的接口,它使您能按指定的时间序列运行代码。使用 start() 方法来启动计时器。为 timer 事件添加事件侦听器,以便将代码设置为按计时器间隔运行。

可以创建 Timer 对象以运行一次或按指定间隔重复运行,从而按计划执行代码。根据 SWF 文件的帧速率或运行时环境(可用内存和其他因素),运行时调度事件的间隔可能稍有不同。例如,如果某个 SWF 文件设置为以每秒 10 帧 (fps)(也就是 100 毫秒的间隔)的速度播放,但计时器设置为在 80 毫秒时触发事件,则将按接近于 100 毫秒的间隔触发事件。大量耗费内存的脚本也可能使事件发生偏差。

以下示例使用 TimerExample 类来说明如何将侦听器方法 timerHandler() 设置为侦听要调度的新 TimerEvent。计时器将在调用 start() 时启动,并且之后将调度计时器事件。 package { import flash.utils.Timer; import flash.events.TimerEvent; import flash.display.Sprite; public class TimerExample extends Sprite { public function TimerExample() { var myTimer:Timer = new Timer(1000, 2); myTimer.addEventListener("timer", timerHandler); myTimer.start(); } public function timerHandler(event:TimerEvent):void { trace("timerHandler: " + event); } } }
timerComplete 每当它完成 Timer.repeatCount 设置的请求数后调度。flash.events.TimerEvent.TIMER_COMPLETEflash.events.TimerEvent 每当它完成 Timer.repeatCount 设置的请求数后调度。 timer 每当 Timer 对象达到根据 Timer.delay 属性指定的间隔时调度。flash.events.TimerEvent.TIMERflash.events.TimerEvent 每当 Timer 对象达到根据 Timer.delay 属性指定的间隔时调度。 Timer 使用指定的 delay 和 repeatCount 状态构造新的 Timer 对象。如果指定的延迟为负数或不是有限数 ErrorErrordelayNumber计时器事件间的延迟(以毫秒为单位)。建议 delay 不要低于 20 毫秒。计时器频率不得超过 60 帧/秒,这意味着低于 16.6 毫秒的延迟可导致出现运行时问题。 repeatCountint0指定重复次数。如果为 0,则计时器重复无限次数。如果不为 0,则将运行计时器,运行次数为指定的次数,然后停止。 使用指定的 delayrepeatCount 状态构造新的 Timer 对象。

计时器不会自动启动;必须调用 start() 方法来启动它。

在以下示例中,为用户提供 90 秒的时间在输入文本字段中输入响应。此外,每隔 30 秒显示一个状态消息,可让用户了解还剩下多少秒。

创建了一个 Timer 对象,它在 30 秒内启动(将延迟设置为 30000 毫秒),并在总共 90 秒的时间内重复启动 3 次。(计时器将在第 3 次后停止。)

myTimer 计时器添加了两个事件侦听器。第一个事件侦听器是由 TimerEvent.TIMER 事件触发的,每次启动计时器时都会发生此事件。timerHandler() 方法将更改 statusTextField 文本字段的文本以反映所剩的秒数。

注意:Timer 类通过增大 currentCount 属性中的数字来跟踪计时器需要启动的次数 (repeats)。

在最后一次调用计时器后,将调度 TimerEvent.TIMER_COMPLETE 事件并调用 completeHandler() 方法。completeHandler() 方法将 inputTextField 文本字段的类型从 INPUT 更改为 DYNAMIC,这意味着用户不再可以输入或更改文本。

package { import flash.display.Sprite; import flash.text.TextField; import flash.text.TextFieldType; import flash.text.TextFieldAutoSize; import flash.utils.Timer; import flash.events.TimerEvent; import flash.events.Event; public class Timer_constructorExample extends Sprite { private var statusTextField:TextField = new TextField(); private var inputTextField:TextField = new TextField(); private var delay:uint = 30000; private var repeat:uint = 3; private var myTimer:Timer = new Timer(delay, repeat); public function Timer_constructorExample() { inputTextField.x = 10; inputTextField.y = 10; inputTextField.border = true; inputTextField.background = true; inputTextField.height = 200; inputTextField.width = 200; inputTextField.multiline = true; inputTextField.wordWrap = true; inputTextField.type = TextFieldType.INPUT; statusTextField.x = 10; statusTextField.y = 220; statusTextField.background = true; statusTextField.autoSize = TextFieldAutoSize.LEFT; myTimer.start(); statusTextField.text = "You have " + ((delay * repeat) / 1000) + " seconds to enter your response."; myTimer.addEventListener(TimerEvent.TIMER, timerHandler); myTimer.addEventListener(TimerEvent.TIMER_COMPLETE, completeHandler); addChild(inputTextField); addChild(statusTextField); } private function timerHandler(e:TimerEvent):void{ repeat--; statusTextField.text = ((delay * repeat) / 1000) + " seconds left."; } private function completeHandler(e:TimerEvent):void { statusTextField.text = "Times Up."; inputTextField.type = TextFieldType.DYNAMIC; } } }
reset 如果计时器正在运行,则停止计时器,并将 currentCount 属性设回为 0,这类似于秒表的重置按钮。 如果计时器正在运行,则停止计时器,并将 currentCount 属性设回为 0,这类似于秒表的重置按钮。然后,在调用 start() 后,将运行计时器实例,运行次数为指定的重复次数(由 repeatCount 值设置)。 Timer.stop()start 如果计时器尚未运行,则启动计时器。 如果计时器尚未运行,则启动计时器。 stop 停止计时器。 停止计时器。如果在调用 stop() 后调用 start(),则将继续运行计时器实例,运行次数为剩余的 重复次数(由 repeatCount 属性设置)。 Timer.reset()currentCount 计时器从 0 开始后触发的总次数。int 计时器从 0 开始后触发的总次数。如果已重置了计时器,则只会计入重置后的触发次数。 delay 计时器事件间的延迟(以毫秒为单位)。Number如果指定的延迟为负数或不是有限数,则将引发异常。 ErrorError 计时器事件间的延迟(以毫秒为单位)。如果在计时器正在运行时设置延迟间隔,则计时器将按相同的 repeatCount 迭代重新启动。

注意:建议 delay 不要低于 20 毫秒。计时器频率不得超过 60 帧/秒,这意味着低于 16.6 毫秒的延迟可导致出现运行时问题。

repeatCount 设置的计时器运行总次数。int 设置的计时器运行总次数。如果重复计数设置为 0,则计时器将持续不断运行,直至调用了 stop() 方法或程序停止。如果重复计数不为 0,则将运行计时器,运行次数为指定的次数。如果设置的 repeatCount 总数等于或小于 currentCount,则计时器将停止并且不会再次触发。 running 计时器的当前状态;如果计时器正在运行,则为 true,否则为 false。Boolean 计时器的当前状态;如果计时器正在运行,则为 true,否则为 false
CompressionAlgorithm CompressionAlgorithm 类为压缩和解压缩选项的名称定义字符串常量。Object CompressionAlgorithm 类为压缩和解压缩选项的名称定义字符串常量。这些常量是 ByteArray.compress()ByteArray.uncompress() 方法的 algorithm 参数所使用的值。 flash.utils.ByteArray.compress()flash.utils.ByteArray.uncompress()DEFLATE 定义用于 deflate 压缩算法的字符串。deflateString 定义用于 deflate 压缩算法的字符串。 ZLIB 定义用于 zlib 压缩算法的字符串。zlibString 定义用于 zlib 压缩算法的字符串。 IDataInput IDataInput 接口提供一组用于读取二进制数据的方法。 IDataInput 接口提供一组用于读取二进制数据的方法。此接口是写入二进制数据的 IDataOutput 接口的 I/O 对应接口。

默认情况下,所有 IDataInput 和 IDataOutput 操作均为“bigEndian”(序列中的最高有效字节存储在最低或第一个存储地址),而且都不分块。如果可用数据不足,则会引发 EOFError 异常。使用 IDataInput.bytesAvailable 属性来确定可供读取的数据有多少。

符号扩展名仅在读取数据时有效,写入数据时无效。因此,无需单独的写入方法就可以使用 IDataInput.readUnsignedByte()IDataInput.readUnsignedShort()。换言之:

  • IDataOutput.writeByte()IDataInput.readUnsignedByte()IDataInput.readByte() 一起使用。
  • IDataOutput.writeShort()IDataInput.readUnsignedShort()IDataInput.readShort() 一起使用。
以下示例使用 DataInputExample 类将布尔值和 pi 的双精度浮点表示形式写入字节数组。这是使用以下步骤完成的:
  1. 声明新的 ByteArray 对象实例 byteArr
  2. 写入布尔值 false 的字节等效值和数学值 pi 的双精度浮点等效值。
  3. 重新读取布尔值和双精度浮点数。

注意如何在末尾添加一段代码以检查文件结尾错误,确保读取的字节流没有超出文件结尾。

package { import flash.display.Sprite; import flash.utils.ByteArray; import flash.errors.EOFError; public class DataInputExample extends Sprite { public function DataInputExample() { var byteArr:ByteArray = new ByteArray(); byteArr.writeBoolean(false); byteArr.writeDouble(Math.PI); byteArr.position = 0; try { trace(byteArr.readBoolean()); // false } catch(e:EOFError) { trace(e); // EOFError: Error #2030: End of file was encountered. } try { trace(byteArr.readDouble()); // 3.141592653589793 } catch(e:EOFError) { trace(e); // EOFError: Error #2030: End of file was encountered. } try { trace(byteArr.readDouble()); } catch(e:EOFError) { trace(e); // EOFError: Error #2030: End of file was encountered. } } } }
IDataOutput interfaceendianFileStream 类Socket 类URLStream 类ByteArray 类EOFError 类readBoolean 从文件流、字节流或字节数组中读取布尔值。没有足够的数据可供读取。 EOFErrorflash.errors:EOFError一个布尔值,如果字节不为零,则为 true,否则为 falseBoolean 从文件流、字节流或字节数组中读取布尔值。读取单个字节,如果字节非零,则返回 true,否则返回 falsereadByte 从文件流、字节流或字节数组中读取带符号的字节。没有足够的数据可供读取。 EOFErrorflash.errors:EOFError返回值的范围是从 -128 到 127。 int 从文件流、字节流或字节数组中读取带符号的字节。 readBytes 从文件流、字节流或字节数组中读取 length 参数指定的数据字节数。没有足够的数据可供读取。 EOFErrorflash.errors:EOFErrorbytesflash.utils:ByteArray要将数据读入的 ByteArray 对象。 offsetuint0bytes 参数中的偏移,应从该位置开始读取数据。 lengthuint0要读取的字节数。默认值 0 导致读取所有可用的数据。 从文件流、字节流或字节数组中读取 length 参数指定的数据字节数。将从 offset 指定的位置开始,将字节读入 bytes 参数指定的 ByteArray 对象。 readDouble 从文件流、字节流或字节数组中读取 IEEE 754 双精度浮点数。没有足够的数据可供读取。 EOFErrorflash.errors:EOFError一个 IEEE 754 双精度浮点数。 Number 从文件流、字节流或字节数组中读取 IEEE 754 双精度浮点数。 readFloat 从文件流、字节流或字节数组中读取 IEEE 754 单精度浮点数。没有足够的数据可供读取。 EOFErrorflash.errors:EOFError一个 IEEE 754 单精度浮点数。 Number 从文件流、字节流或字节数组中读取 IEEE 754 单精度浮点数。 readInt 从文件流、字节流或字节数组中读取带符号的 32 位整数。没有足够的数据可供读取。 EOFErrorflash.errors:EOFError返回值的范围是从 -2147483648 到 2147483647。 int 从文件流、字节流或字节数组中读取带符号的 32 位整数。 readMultiByte 使用指定的字符集从文件流、字节流或字节数组中读取指定长度的多字节字符串。没有足够的数据可供读取。 EOFErrorflash.errors:EOFErrorUTF-8 编码的字符串。 Stringlengthuint要从字节流中读取的字节数。 charSetString表示用于解释字节的字符集的字符串。可能的字符集字符串包括 "shift-jis""cn-gb""iso-8859-1"”等。有关完整列表,请参阅支持的字符集

注意:如果当前系统无法识别 charSet 参数的值,则 Adobe® Flash® Player 或 Adobe® AIR® 将采用系统的默认代码页作为字符集。例如,myTest.readMultiByte(22, "iso-8859-01") 中使用 01 而不是 1charSet 参数值可能在开发系统而不是另一个系统中起作用。在其他系统上,Flash Player 或 AIR 运行时将使用系统的默认代码页。

使用指定的字符集从文件流、字节流或字节数组中读取指定长度的多字节字符串。
readObject 从文件流、字节流或字节数组中读取以 AMF 序列化格式编码的对象。没有足够的数据可供读取。 EOFErrorflash.errors:EOFError反序列化的对象 从文件流、字节流或字节数组中读取以 AMF 序列化格式编码的对象。 objectEncodingflash.net.registerClassAlias()readShort 从文件流、字节流或字节数组中读取带符号的 16 位整数。没有足够的数据可供读取。 EOFErrorflash.errors:EOFError返回值的范围是从 -32768 到 32767。 int 从文件流、字节流或字节数组中读取带符号的 16 位整数。 readUTFBytes 从字节流或字节数组中读取 UTF-8 字节序列,并返回一个字符串。没有足够的数据可供读取。 EOFErrorflash.errors:EOFError由指定长度字符的字节表示形式生成的 UTF-8 字符串。 Stringlengthuint要读取的字节数。 从字节流或字节数组中读取 UTF-8 字节序列,并返回一个字符串。 readUTF 从文件流、字节流或字节数组中读取 UTF-8 字符串。没有足够的数据可供读取。 EOFErrorflash.errors:EOFError由字符的字节表示形式生成的 UTF-8 字符串。 String 从文件流、字节流或字节数组中读取 UTF-8 字符串。假定字符串的前缀是无符号的短整型(以字节表示长度)。

此方法类似于 Java® IDataInput 接口中的 readUTF() 方法。

readUnsignedByte 从文件流、字节流或字节数组中读取无符号的字节。没有足够的数据可供读取。 EOFErrorflash.errors:EOFError返回值的范围是从 0 到 255。 uint 从文件流、字节流或字节数组中读取无符号的字节。 readUnsignedInt 从文件流、字节流或字节数组中读取无符号的 32 位整数。没有足够的数据可供读取。 EOFErrorflash.errors:EOFError返回值的范围是从 0 到 4294967295。 uint 从文件流、字节流或字节数组中读取无符号的 32 位整数。 readUnsignedShort 从文件流、字节流或字节数组中读取无符号的 16 位整数。没有足够的数据可供读取。 EOFErrorflash.errors:EOFError返回值的范围是从 0 到 65535。 uint 从文件流、字节流或字节数组中读取无符号的 16 位整数。 bytesAvailable 返回可在输入缓冲区中读取的数据的字节数。uint 返回可在输入缓冲区中读取的数据的字节数。在尝试使用某一种读取方法读取数据之前,用户代码必须调用 bytesAvailable 以确保有足够的数据可用。 endian 数据的字节顺序:为 Endian 类中的 BIG_ENDIAN 或 LITTLE_ENDIAN 常量。String 数据的字节顺序:为 Endian 类中的 BIG_ENDIANLITTLE_ENDIAN 常量。 Endian 类objectEncoding 用于确定在使用 readObject() 方法写入或读取二进制数据时是使用 AMF3 格式还是 AMF0 格式。uint 用于确定在使用 readObject() 方法写入或读取二进制数据时是使用 AMF3 格式还是 AMF0 格式。该值为 ObjectEncoding 类中的常数。 readObject()IDataOutput.writeObject()ObjectEncoding 类
Dictionary Dictionary 类用于创建属性的动态集合,该集合使用 strict equality (===) 运算符进行键比较。Object Dictionary 类用于创建属性的动态集合,该集合使用 strict equality (===) 运算符进行键比较。将对象用作键时,会使用对象的标识来查找对象,而不是使用在对象上调用 toString() 所返回的值。

以下语句显示了一个 Dictionary 对象和一个 key 对象之间的关系:

 var dict = new Dictionary();
 var obj = new Object();
 var key:Object = new Object();
 key.toString = function() { return "key" }
 
 dict[key] = "Letters";
 obj["key"] = "Letters";
 
 dict[key] == "Letters"; // true
 obj["key"] == "Letters"; // true
 obj[key] == "Letters"; // true because key == "key" is true b/c key.toString == "key"
 dict["key"] == "Letters"; // false because "key" === key is false
 delete dict[key]; //removes the key
 
=== (strict equality)Dictionary 创建新的 Dictionary 对象。weakKeysBooleanfalse表示 Dictionary 对象在对象键上使用“弱”引用。如果对某个对象的唯一引用位于指定的 Dictionary 对象中,则键符合垃圾回收的条件,并且在回收对象时会被从表中删除。 创建新的 Dictionary 对象。要从 Dictionary 对象中删除键,请使用 delete 运算符。