FileStream オブジェクトの
position
プロパティでは、次の読み取りまたは書き込みメソッドでデータの読み取りまたは書き込みを行う位置を指定します。
読み取りまたは書き込み操作の前に、
position
プロパティにファイル内の任意の有効な位置を設定します。
例えば、次のコードでは、ファイル内の位置 8 にストリング「
hello
」を(UTF エンコード形式で)書き込みます。
var myFile:File = File.documentsDirectory.resolvePath("AIR Test/test.txt");
var myFileStream:FileStream = new FileStream();
myFileStream.open(myFile, FileMode.UPDATE);
myFileStream.position = 8;
myFileStream.writeUTFBytes("hello");
最初に FileStream オブジェクトを開いたときは、
position
プロパティは 0 に設定されています。
読み取り操作を行う場合はその操作の前に、
position
の値が 0 以上で、かつファイルのバイト数より小さい値(ファイル内に存在する位置)に設定されている必要があります。
position
プロパティの値は、次の場合にのみ変更されます。
FileStream オブジェクトの読み取りまたは書き込みメソッドを呼び出すと、すぐに
position
プロパティの値が、読み取りまたは書き込みを行ったバイト数だけインクリメントされます。使用する読み取りメソッドによって、
position
プロパティの値が、指定された読み取り対象のバイト数だけインクリメントされる場合と、使用できるバイト数だけインクリメントされる場合があります。その後に読み取りまたは書き込みメソッドを呼び出すと、その新しい位置から読み取りまたは書き込みが開始されます。
var myFile:File = File.documentsDirectory.resolvePath("AIR Test/test.txt");
var myFileStream:FileStream = new FileStream();
myFileStream.open(myFile, FileMode.UPDATE);
myFileStream.position = 4000;
trace(myFileStream.position); // 4000
myFileStream.writeBytes(myByteArray, 0, 200);
trace(myFileStream.position); // 4200
ただし 1 つ例外があり、追加モードで開いた FileStream では、書き込みメソッドの呼び出し後に
position
プロパティは変更されません(追加モードでは、
position
プロパティの値に関係なく、常にファイルの末尾にデータが書き込まれます)。
非同期操作用に開いたファイルでは、次のコード行が実行されるまで書き込み操作は実行されません。ただし、複数の非同期メソッドを連続して呼び出すことは可能で、その場合はランタイムによって順番に実行されます。
var myFile:File = File.documentsDirectory.resolvePath("AIR Test/test.txt");
var myFileStream:FileStream = new FileStream();
myFileStream.openAsync(myFile, FileMode.WRITE);
myFileStream.writeUTFBytes("hello");
myFileStream.writeUTFBytes("world");
myFileStream.addEventListener(Event.CLOSE, closeHandler);
myFileStream.close();
trace("started.");
closeHandler(event:Event):void
{
trace("finished.");
}
このコードのトレース出力は次のようになります。
started.
finished.
position
の値は、読み取りまたは書き込みメソッドを呼び出した後すぐに(いつでも)指定できます。次の読み取りまたは書き込み操作は、その位置から開始されます。例えば、次のコードでは、
writeBytes()
メソッドを呼び出した直後に
position
プロパティを設定しています。書き込み操作の完了後も、
position
はその値(300)に設定されています。
var myFile:File = File.documentsDirectory.resolvePath("AIR Test/test.txt");
var myFileStream:FileStream = new FileStream();
myFileStream.openAsync(myFile, FileMode.UPDATE);
myFileStream.position = 4000;
trace(myFileStream.position); // 4000
myFileStream.writeBytes(myByteArray, 0, 200);
myFileStream.position = 300;
trace(myFileStream.position); // 300