Парсинг файлов средствами URLStream
Здравствуйте!
Сразу хочу заметить, что я новичок как на этом форуме, так и в вопросах ActionScript в частности. Поэтому сильно прошу не пинать. :)
Идея моя заключается в следующем: пользователь скармливает флэшу файл (в общем случае - локальный файл через URLRequest), этот файл начинает загружаться URLStream и как только хватает данных для парсинга файла, закачка прерывается.
В идеале это должно работать для файлов любого размера - я ведь читаю только первые пару килобайт, однако ж не всё так гладко.
Вот такой небольшой класс реализует чтение (простейший набросок)
Код AS3:
package Classes.Data
{
// импорт стандартных классов
import flash.net.*;
import flash.errors.*;
import flash.events.*;
//==============================================
// класс
public class CommonDataParser
{
//==============================================
// данные класса
//
private var m_loader:URLStream;
//==============================================
// конструктор
//
public function CommonDataParser ()
{
trace ("CommonDataParser - constructor");
m_loader = new URLStream ();
}
//==============================================
// "destructor"
//
public function destroy ()
{
trace ("CommonDataParser - destructor");
if (m_loader != null)
{
if (m_loader.connected)
{
m_loader.close ();
}
m_loader.removeEventListener (Event.COMPLETE, completeHandler);
m_loader.removeEventListener (HTTPStatusEvent.HTTP_STATUS, httpStatusHandler);
m_loader.removeEventListener (IOErrorEvent.IO_ERROR, ioErrorHandler);
m_loader.removeEventListener (ProgressEvent.PROGRESS, progressHandler);
m_loader.removeEventListener (SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
m_loader = null;
}
}
//==============================================
// методы
//
public function parse (filePath:String):void
{
if ((filePath != null) && (filePath.length > 0))
{
trace ("File path: " + filePath);
var req:URLRequest = new URLRequest(filePath);
m_loader.addEventListener (Event.COMPLETE, completeHandler);
m_loader.addEventListener (HTTPStatusEvent.HTTP_STATUS, httpStatusHandler);
m_loader.addEventListener (IOErrorEvent.IO_ERROR, ioErrorHandler);
m_loader.addEventListener (ProgressEvent.PROGRESS, progressHandler);
m_loader.addEventListener (SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
try
{
m_loader.load (req);
}
catch (error:Error)
{
trace ("Unable to load requested URL: " + error);
}
}
}
private function completeHandler (event:Event):void
{
trace ("completeHandler: " + event);
}
private function progressHandler (event:Event):void
{
trace ("progressHandler: " + event);
if (event.target.bytesAvailable > 200000)
{
trace ("available: " + event.target.bytesAvailable);
destroy();
trace ("CommonDataParser - after destroy");
}
}
private function securityErrorHandler (event:SecurityErrorEvent):void
{
trace ("securityErrorHandler: " + event);
}
private function httpStatusHandler (event:HTTPStatusEvent):void
{
trace ("httpStatusHandler: " + event);
}
private function ioErrorHandler (event:IOErrorEvent):void
{
trace ("ioErrorHandler: " + event);
}
}
}
В принципе, скрипт работает как надо - после вызова метода parse ("Имя_файла") оттуда читается всё, что надо, потом закрывается, удаляется, НО - после этого флэш-плеер висит как минимум с десяток секунд без отклика на мышь. Потом (через эти злосчастные десять секунд) всё приходит в норму и плеер снова реагирует на команды. Чем больше файл (я пробовал вплоть до 4 Гб), тем дольше эта пауза после "обрыва" загрузки. Никаких исключений и ошибок не выбрасывается.
Замечал по диспетчеру задач, что памяти особо много на выполнение не уходит, да и проц не сильно подгружается, но наглухо виснет после последнего обновления экрана вслед за окончанием парсинга.
Вопрос - с чем это может быть связано, как это можно победить и вообще, можно ли?
Может есть другой способ реализации парсинга файлов любой структуры без необходимости их полной загрузки в память (кроме как на Air)?
ПС
Система Win XP 32bit, Adobe Flash CS4, AS3.0
Спасибо.
|