LineReader?
- Socket,URLStream,FileStream?から非同期で一行ずつ読み込み処理をしたい時にちょっとだけ助けてくれるクラス。
注意
まだきっと不安定。
使い方
Socket, URLStream, FileStream? をconnect(),load(),openAsync()する前にLineReader?のコンストラクタに渡し、 LineReader?オブジェクトを生成します。
LineReader?オブジェクトは一行読み込まれるごとにProgressEvent?.PROGRESSイベントを発生させます。
イベントを受け取ったら、受け取ったイベントのtargetか生成したLineReader?オブジェクトのbufferプロパティに 一行分のデータ(改行無し)がByteArray?で入っているので、toString()するなりreadMultiByte()するなり好きにしてください。
生成したLineReader?オブジェクトは以下のプロパティを設定出来ます。
skipBlankLine 空行時にイベントを発生させない(default: false)
trimLineFeed bufferに改行コードを保存しない(default: true)
ただし、読み込みの完了などではイベントが起こらないので、最終行は自力でLineReader?オブジェクトのbufferプロパティから 取得する必要があります。
import flash.events.Event;
import flash.events.ProgressEvent;
import flash.filesystem.File;
import flash.filesystem.FileStream;
import flash.filesystem.FileMode;
import org.libspark.utils.LineReader;
var file:File = new File("/hoge/fuga.txt");
var stream:FileStream = new FileStream();
var reader:LineReader = new LineReader(stream);
var count:uint = 0;
reader.addEventListener( ProgressEvent.PROGRESS, progressHandler);
stream.addEventListener( Event.COMPLETE, completeHandler);
stream.readAhead = 2048;
stream.openAsync(file, FileMode.READ);
function progressHandler(e:ProgressEvent):void
{
count++;
trace( count + ": " + e.target.buffer.toString() + "\n");
}
function completeHandler(e:Event):void
{
count++;
trace( count + ": " + reader.buffer.toString() + "\n");
trace( "[EOF]");
stream.close();
}
ProgressEvent?.PROGRESSで送られてくるbytesLoadedプロパティは、解析済みの行までのバイト数になっている筈。
ダウンロード/ソース
- http://www.libspark.org/svn/as3/Utils/src/org/libspark/utils/LineReader.as
- [source/as3/Utils/src/org/libspark/utils/LineReader.as リポジトリブラウザ]
ライセンス
- MITライセンス
コミッタ
- tera
TODO
FileStream? 以外でも動かしてみる。
きちんとテストする。
改行判定にかなりおかしいところがあったのでなおしてみたら、コードが汚くなったので、できればリファクタリングする。
