Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 我如何写一个巨大的bytearray文件,并避免可怕的内存错误_Actionscript 3_Air_Bytearray_File Writing - Fatal编程技术网

Actionscript 3 我如何写一个巨大的bytearray文件,并避免可怕的内存错误

Actionscript 3 我如何写一个巨大的bytearray文件,并避免可怕的内存错误,actionscript-3,air,bytearray,file-writing,Actionscript 3,Air,Bytearray,File Writing,我正在做一个Air项目,它下载巨大的(zip)文件,然后解压,最后删除它下载的原始.zip文件 除了我想将解压后的文件写入磁盘时,其他一切都运行顺利 麻烦的是,我不断遇到这个小怪物的问题,一个错误 Error: Error #1000: The system is out of memory. 这是代码中让我悲伤的部分。当文件很小(在3MB文件上测试)时,这种方法非常有效,但当我尝试一个大文件(458MB)时,就会出现错误 private function unzipFile() {

我正在做一个Air项目,它下载巨大的(zip)文件,然后解压,最后删除它下载的原始.zip文件

除了我想将解压后的文件写入磁盘时,其他一切都运行顺利

麻烦的是,我不断遇到这个小怪物的问题,一个错误

Error: Error #1000: The system is out of memory.
这是代码中让我悲伤的部分。当文件很小(在3MB文件上测试)时,这种方法非常有效,但当我尝试一个大文件(458MB)时,就会出现错误

private function unzipFile()
    {
        var pulledFile:FZipFile;
        var index:int = 0;
        var chunkSize:int = 1000000;

        Console.log("Unzipping file...");
        var zip:FZip = new FZip();
        zip.addEventListener(Event.COMPLETE, onUnzipComplete);
        var fileStream:FileStream = new FileStream();

        zip.load(new URLRequest(urlToUnzip));

        function onUnzipComplete(e:Event)
        {
            pulledFile = zip.getFileAt(0);
            var file:File = File.documentsDirectory.resolvePath(pulledFile.filename);
            fileStream.openAsync(file, FileMode.WRITE);
            writeChunk();
        }

        function writeChunk()
        {
            var bytesToGet:int = pulledFile.content.bytesAvailable;
            if (bytesToGet > chunkSize)
                bytesToGet = chunkSize;

            Console.log("Writing chunk " + (int((pulledFile.content.length - pulledFile.content.bytesAvailable) / chunkSize) + 1) + " of " + (int(pulledFile.content.length / chunkSize) + 1));

            var fileData:ByteArray = new ByteArray();
            pulledFile.content.readBytes(fileData, 0, bytesToGet);

            fileStream.writeBytes(fileData, 0, fileData.length);

            if (index < pulledFile.content.bytesAvailable)
            {
                writeChunk();
                index += bytesToGet;
            }
            else
            {
                fileStream.close();
                Console.log("Unzipping complete");
            }
        }
    }
如何在不知道有多少字节可供使用的情况下将内容逐步写入文件?如果我无法访问
bytesavable
属性,我如何知道我已经写完了


我用它来解压。

这很难,但我发现了。诀窍是使用
FZip
的“序列化”方法,并避免完全接触内容的属性
ByteArray

这是最后一个有效的代码

private function unzipFile()
    {
        var pulledFile:FZipFile;

        Console.log("Decompressing file...");
        var zip:FZip = new FZip();
        zip.addEventListener(Event.COMPLETE, onUnzipComplete);

        var fileStream:FileStream = new FileStream();

        zip.load(new URLRequest(urlToUnzip));

        function onUnzipComplete(e:Event)
        {
            pulledFile = zip.getFileAt(0);
            var file:File = File.documentsDirectory.resolvePath("Easywatch/" + pulledFile.filename);
            fileStream.open(file, FileMode.WRITE);
            zip.serialize(fileStream, false);
            fileStream.close();

            Console.log("Decompression complete");
        }
    }

与其将剩余的字节数组大小存储在局部变量中,不如尝试检查
if(pullerdfile.content.bytesavable>0)
,然后从数组中取出一块或更小的块。我根本无法访问bytesavable。只是尝试了你的建议,不能跟踪它,不能把它放在条件语句中,什么都没有。我有一个160MB的zip文件,里面的文件是516MB。我尝试了上述方法,但它只写入313MB数据(文件已损坏),没有任何错误。我错过什么了吗?
private function unzipFile()
    {
        var pulledFile:FZipFile;

        Console.log("Decompressing file...");
        var zip:FZip = new FZip();
        zip.addEventListener(Event.COMPLETE, onUnzipComplete);

        var fileStream:FileStream = new FileStream();

        zip.load(new URLRequest(urlToUnzip));

        function onUnzipComplete(e:Event)
        {
            pulledFile = zip.getFileAt(0);
            var file:File = File.documentsDirectory.resolvePath("Easywatch/" + pulledFile.filename);
            fileStream.open(file, FileMode.WRITE);
            zip.serialize(fileStream, false);
            fileStream.close();

            Console.log("Decompression complete");
        }
    }