FileReference.save()重复ByteArray

时间:2009-05-15 17:03:14

标签: flex flash actionscript-3 flash-10

我使用FileReference.save()遇到了内存问题。我的Flash应用程序实时生成大量数据,需要将此数据保存到本地文件中。据我了解,Flash 10(而不是AIR)不支持流式传输到文件。但是,更糟糕的是FileReference.save()在保存之前复制了所有数据。我正在寻找一种解决方法来解决这种双倍的内存使用问题并考虑以下方法:

如果我将ByteArray的自定义子类作为参数传递给FileReference.save(),该ByteArray子类将覆盖所有read *()方法,该怎么办?重写的read *()方法将等待我的应用程序生成一段数据,返回这段数据并立即将其从内存中删除。我知道将生成多少数据,所以我也可以覆盖长度/ bytesAvailable方法。

有可能吗?你能给我一些提示怎么做吗?我已经创建了一个ByteArray的子​​类,为它注册了一个别名,将这个子类的一个实例传递给FileReference.save(),但不知何故,FileReference.save()似乎将它视为ByteArray实例而不是调用我的任何被覆盖的方法......

非常感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

这不是我以前尝试过的东西,但是你可以尝试将数据发送到一个php应用程序来处理将ByteArray保存到服务器,就像将图像保存到服务器一样,这样你就可以使用URLLoader .data相反,使用这样的东西:

http://www.zedia.net/2008/sending-bytearray-and-variables-to-server-side-script-at-the-same-time/

答案 1 :(得分:0)

这是一个有趣的想法。或许首先,您应该在扩展的ByteArray中添加跟踪,以查看FileReference#save()在内部的功能。

如果它有某种

while( originalByteArray.bytesAvailable ) 
  writeToSaveBuffer( originalByteArray.readByte() );

功能覆盖可以像你说的那样在每次读取时截断原始缓冲区,例如:

override function readByte() : uint {
  var b : uint = super.readByte();
  // Truncate the bytes (assuming bytesAvailable = length - removedBytes)
  length = length - bytesAvailable;
  return b;
}

另一方面,如果这个现在有效,我想原来的字节数组将不再在应用程序中可用。

(我自己没有对此进行测试,截断可能需要比示例更多的工作)