0

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

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

这有没有可能?你能给我一些提示吗?我创建了一个 ByteArray 的子类,为它注册了一个别名,将此子类的一个实例传递给 FileReference.save(),但不知何故 FileReference.save() 似乎把它当作一个 ByteArray 实例来对待,而不是调用我的任何重写方法...

非常感谢您的帮助!

4

2 回答 2

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;
}

另一方面,如果这现在可行,我猜原始字节数组以后将不再在应用程序中可用。

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

于 2009-05-16T14:11:01.240 回答
0

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

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

于 2009-05-15T18:24:27.457 回答