Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 20.08.2011, 18:53
ERrorMAKros вне форума Посмотреть профиль Отправить личное сообщение для ERrorMAKros Посетить домашнюю страницу ERrorMAKros Найти все сообщения от ERrorMAKros
  № 1  
Ответить с цитированием
ERrorMAKros
 
Аватар для ERrorMAKros

Регистрация: May 2008
Адрес: Земля.Украина.Одесса
Сообщений: 219
Отправить сообщение для ERrorMAKros с помощью ICQ Отправить сообщение для ERrorMAKros с помощью Skype™
Question Вопрос по чтению данных из файла!

Добрый день,

Реализую AIR приложение, которое представляет из себя uploader больших файлов.

На рассмотрение: К примеру, вот такой вот код моей реализации, который из определенного файла загружает в byteArray его последние READING_DATA_SIZE байт;
Код AS3:
package  {
 
	import flash.utils.ByteArray;
	import flash.events.Event;
	import flash.filesystem.File;
	import flash.filesystem.FileMode;
	import flash.filesystem.FileStream;
 
	public class Core {
 
		private static const READING_DATA_SIZE:uint = 500;
 
		private var _fileHandler:File;
		private var _fileStream:FileStream;
 
		public function Core() {
			_fileHandler = new File("bigfile.bin");
			trace("File Size:", _fileHandler.size);
			_fileStream = new FileStream();
			_fileStream.addEventListener(Event.COMPLETE, this.evFileLoadingCompleteHandler);
			_fileStream.openAsync(_fileHandler, FileMode.READ);
		// 	устанавливаем позицию, с которой будет производиться начало чтения данных файла;
			_fileStream.position = _fileHandler.size - Core.READING_DATA_SIZE; 
		}
 
		public function evFileLoadingCompleteHandler(e:Event):void {
			var readingData:ByteArray = new ByteArray();
			var instance:FileStream = e.currentTarget as FileStream;
			instance.readBytes(readingData, 0, Core.READING_DATA_SIZE);
			instance.close();
			trace("Reading Data Size:", readingData.bytesAvailable);
		}
	}
}
Подскажите пожалуйста - верна ли данная реализация или существуют более быстрые или надежные способы?

Старый 20.08.2011, 19:02
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 2  
Ответить с цитированием
in4core
[+4 06.05.14]
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
Вполне сносная реализация. Не вижу проблем для кипиша!
__________________
Марк Tween

Старый 20.08.2011, 19:24
ERrorMAKros вне форума Посмотреть профиль Отправить личное сообщение для ERrorMAKros Посетить домашнюю страницу ERrorMAKros Найти все сообщения от ERrorMAKros
  № 3  
Ответить с цитированием
ERrorMAKros
 
Аватар для ERrorMAKros

Регистрация: May 2008
Адрес: Земля.Украина.Одесса
Сообщений: 219
Отправить сообщение для ERrorMAKros с помощью ICQ Отправить сообщение для ERrorMAKros с помощью Skype™
Дело в том, что я использую метод
Код AS3:
_fileStream.openAsync(...)
вместо
Код AS3:
_fileStream.open(...)
Это для того, что бы гарантированно знать что чтение было окончено (сработает подписка на событие _fileStream.addEventListener(Event.COMPLETE, this.evFileLoadingCompleteHandler))

И, в данном случае, если
Код AS3:
_fileStream.position = _fileHandler.size / 2; // начать чтение с середины файла;
начинаются проблемы!

Увидеть в чем проблема мы сможем, если в конструктор добавим setInterval(getBuffLength, 1);

Код AS3:
public function getBuffLength():void {
 trace(_fileStream.bytesAvailable);
}
то увидим что чтение файла начинается вовсе не с позиции _fileStream.position, а с самого начала файла. То есть - мы уверенно скармливаем оперативной памяти 4 гигабайта данных!!!!

А при чтении данных через _fileStream.open() мы не имеем возможности получать какие то события о том, что чтение данных успешно завершено (Event.COMPLETE)!!!

Вот они подводные камни!!!!

Старый 26.09.2012, 20:02
Zarion вне форума Посмотреть профиль Отправить личное сообщение для Zarion Найти все сообщения от Zarion
  № 4  
Ответить с цитированием
Zarion

Регистрация: Jun 2012
Сообщений: 17
Я понимаю, что ответ на этот вопрос автору топика уже давно не актуален. Но он был актуален для меня еще пару часов назад. Теперь ответ найден, может он кому-то пригодиться еще.

Цитата:
Сообщение от ERrorMAKros Посмотреть сообщение
Дело в том, что я использую метод
Код AS3:
_fileStream.openAsync(...)
вместо
Код AS3:
_fileStream.open(...)
Это для того, что бы гарантированно знать что чтение было окончено (сработает подписка на событие _fileStream.addEventListener(Event.COMPLETE, this.evFileLoadingCompleteHandler))
В этом нет никакой необходимости! Чтобы иметь произвольный доступ к любой точке большого файла, достаточно использовать метод FileStream.open(). Событие Event.COMPLETE при этом обрабатывать не нужно, да оно и не вызывается, так как доступ к любому смещению файла, посредством кода, вроде FileStream.position = File.size/2, происходит практически мгновенно.

Цитата:
Сообщение от ERrorMAKros Посмотреть сообщение
И, в данном случае, если
Код AS3:
_fileStream.position = _fileHandler.size / 2; // начать чтение с середины файла;
начинаются проблемы!
Проблемы будут, если использовать асинхронный доступ к файлу. При синхронном доступе, все нормально!

Цитата:
Сообщение от ERrorMAKros Посмотреть сообщение
Увидеть в чем проблема мы сможем, если в конструктор добавим setInterval(getBuffLength, 1);

Код AS3:
public function getBuffLength():void {
 trace(_fileStream.bytesAvailable);
}
то увидим что чтение файла начинается вовсе не с позиции _fileStream.position, а с самого начала файла. То есть - мы уверенно скармливаем оперативной памяти 4 гигабайта данных!!!!
При асинхронном доступе, действительно, считывание данных идет последовательно в буфер чтения, с нулевой позиции, причем буфер периодически перезаписывается при событиях ProgressEvent.PROGRESS. Завершение процесса оформляется событием Event.COMPLETE. Так что «скормить оперативной памяти 4 гигабайта данных» можно, но в буфере чтения в любой момент будет ограниченное количество данных. Понятно, что в данном случае нас этот вариант не устраивает.

Цитата:
Сообщение от ERrorMAKros Посмотреть сообщение
А при чтении данных через _fileStream.open() мы не имеем возможности получать какие то события о том, что чтение данных успешно завершено (Event.COMPLETE)!!!
Как уже было сказано, в этом событии нет никакой необходимости, ибо позиционирование головки чтения диска в файле, происходит достаточно быстро (1-2 миллисекунды, не более).

Цитата:
Сообщение от ERrorMAKros Посмотреть сообщение
Вот они подводные камни!!!!
Все они легко обходятся! Вот Ваш итоговый код, каким он должен быть:

Код AS3:
package  {  
  import flash.utils.ByteArray;
  import flash.events.Event;
  import flash.filesystem.File;
  import flash.filesystem.FileMode;
  import flash.filesystem.FileStream;
 
  public class Core {
    private static const READING_DATA_SIZE:uint = 500;
 
    private var _fileHandler:File = null;
    private var _fileStream:FileStream = null;
    private var _readingData:ByteArray = null;
 
    public function Core() {
      _readingData = new ByteArray();
      _fileHandler = new File("bigfile.bin");
      _fileStream = new FileStream();
 
      _fileStream.open(_fileHandler, FileMode.READ);
 
      // Устанавливаем позицию, с которой будет производиться начало чтения данных файла
      _fileStream.position = _fileHandler.size - READING_DATA_SIZE; 
 
      // Чтение данных в буфер, если количество доступных данных не очень много, 
      // то считывание происходит быстро
      _fileStream.readBytes(_readingData, 0, _fileStream.bytesAvailable);
 
      _fileStream.close();
 
      trace("Reading Data Size: " + _readingData.bytesAvailable);  // = READING_DATA_SIZE
    }
  }
}

Создать новую тему Ответ Часовой пояс GMT +4, время: 00:41.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 00:41.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.