AS3 fileStream появляется, чтобы прочитать файл в память - PullRequest
2 голосов
/ 25 января 2011

Я пишу процесс, в котором пользователям нужно будет выбрать файл, который намного превышает их доступную оперативную память, и разбить этот файл на небольшие куски (для загрузки).

Я могу создать ссылку на файл для указанного файла, но когда я пытаюсь передать его в fileStream, он, кажется, пытается прочитать вещь в память, прежде чем действовать над ней.

Есть ли способ заставить fileStream просто взять ссылку на файл и затем использовать readBytes так, как это задокументировано?

Вот мой код ... он вызывается, когда пользователь выбирает файл в диалоге браузера.

private function selectHandler(event:Event):void {
        var file:File = File(event.target);
        trace("selectHandler: name=" + file.name );

        var stream:FileStream = new FileStream();

        var f:File = event.target as File;
        stream.open(f, FileMode.READ);  //here the process will lock up if the file you pass it is too large.
        var bytes:ByteArray = new ByteArray();
        stream.readBytes(bytes,0,1024);
        trace(bytes);
        stream.close();
}

Заранее благодарен.

Ответы [ 2 ]

4 голосов
/ 31 января 2011

Итак, решение ...

 stream.readAhead = 10000;// some reasonable number
 stream.openAsync(f, FileMode.READ);  //here the process will no longer lock up, if the above chunk is set to a number that Flash can handle.



   //then in your PROGRESS listener you read the bytes into a byteArray
  if(target.availableBytes >= 10000){//you need this because progress gets called many times before the full chunk is read. You only want to use it when you have the full chunk. (you also will want to keep track of the total read and when that total + chunk > fileSize, you'll want to adjust your chunk to read in that last bunch of bytes.
    var bytes:ByteArray = new ByteArray();
    stream.readBytes(bytes,0,event.target.availableBytes); //this will provoke the next segment to get read as well
  }
1 голос
/ 25 января 2011

В классе FileStream есть метод openAsync , который, конечно, асинхронно отправляет вам части файла, но я не знаю, будет ли он вам полезен, так как у вас все равно будет сохранить детали в памяти для последующей загрузки. Я думаю, что альтернативой будет использование NativeProcess для извлечения определенных частей файла, например, через Java.

У меня была похожая ситуация, когда мне нужно было получить хэш первых и последних 64 байтов некоторых довольно больших файлов (до 10 ГБ), и последний метод (NativeProcess> Java) работал как чудо. Я полный n00b в Java, но если вы хотите, я могу опубликовать указанный код (я скопировал / вставил фрагменты, пока он не заработал, так что, скорее всего, он довольно грубый).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...