ファイルの入出力について
FileStreamクラスについて
■FileStreamクラスについて
FileStream クラスを使用すると、ファイルを開いて、データを読み込んだり、書き込んだりする事ができます。
ファイルやフォルダの情報を取得したり、ファイルやフォルダの移動やコピー、削除を行ないたい場合は、File クラスを使用します。
File クラスについては、こちらで解説しています。
■データのアクセス方法
ファイルのデータは、ByteArray 型のように、 1 バイトずつの配列に格納された状態となっています。
配列の位置を変更するには、position プロパティを使用します。
このプロパティに設定した値が、アクセス開始位置となります。
position をセットしてから、読み書き用のメソッドを呼び出すと、その位置からデータを読み込んだり書き込んだりする事ができます。
例えば、position に 4 をセットすると図のようにアクセス開始位置が移動します。
続けて、readInt() メソッドを使用すると、 4 から 7 番地までの 4 バイト分のデータが読み取られ、整数値として取得できます。
一時的な作業用ファイルに、データを書き込んだり、データを読み込んだりする例です。
一時的な作業用ファイルに、データを書き込んだり読み込んだりする例 (注意:ファイル操作を行います!! )
import flash.filesystem.File;
import flash.filesystem.FileStream;
import flash.filesystem.FileMode;
// 一時的な作業用ファイルを作成
var file : File = File.createTempFile();
// ファイルストリームオブジェクトを作成する
var stream : FileStream = new FileStream();
// ------------------------------------------------------------
// 新規書き込み用の例
// ------------------------------------------------------------
// 書き込みモードでファイルを開く
stream.open(file , FileMode.WRITE);
// アクセス開始位置を 4 番目に移動
stream.position = 4;
// 32bit整数値をセット( 4 バイト分書き込む)
stream.writeInt(12345678);
// ファイルストリームを閉じる
stream.close ();
// ------------------------------------------------------------
// 読み込み用の例
// ------------------------------------------------------------
// 読み込みモードで開く
stream.open(file , FileMode.READ);
// アクセス開始位置を 4 番目に移動
stream.position = 4;
// 32bit符号あり整数値を取得( 4 バイト分読み込む)
var a:int = stream.readInt();
trace(a);
// ファイルストリームを閉じる
stream.close ();
// 一時的な作業用ファイルを削除
file.deleteFile ();
■ByteArray クラスと同じ、読み書き用メソッドが利用可能
FileStream オブジェクトは ByteArray クラスと同じ、読み書き用メソッドが使用できます。
ByteArray クラスと同じ感覚で、ファイルにアクセスする事ができます。
ただし、配列アクセス演算子には対応していません。[ ] を使って直接データにアクセスする事はできません。
■読み書き用メソッドを使うと、アクセス開始位置が進む
読み書き用のメソッドを使用すると、自動的に position も加算されます。
読み書き用のメソッドを繰り返して呼び出せば、漏れなく順番にデータにアクセスすることができます。
書き込み用メソッドを呼び出すと、position が変化するか確認する (0 → 1 → 3 → 7 → 16 ) (注意:ファイル操作を行います!! )
import flash.filesystem.File;
import flash.filesystem.FileStream;
import flash.filesystem.FileMode;
// 一時的な作業用ファイルを作成
var file : File = File.createTempFile();
// ファイルストリームオブジェクトを作成する
var stream : FileStream = new FileStream();
// 書き込みモードでファイルを開く
stream.open(file , FileMode.WRITE);
// アクセス開始位置を 0 番目に移動
stream.position = 0;
trace(stream.position);
// 8bit整数値をセット( 1 バイト分書き込む)
stream.writeByte(0x12);
trace(stream.position);
// 16bit整数値をセット( 2 バイト分書き込む)
stream.writeShort(0x1234);
trace(stream.position);
// 32bit整数値をセット( 4 バイト分書き込む)
stream.writeInt(0x12345678);
trace(stream.position);
// 適当な数値を 9 バイト分書き込む
stream.writeByte(136); // 8bit整数値をセット( 1 バイト分書き込む)
stream.writeByte(158); // 8bit整数値をセット( 1 バイト分書き込む)
stream.writeByte(198); // 8bit整数値をセット( 1 バイト分書き込む)
stream.writeByte(183); // 8bit整数値をセット( 1 バイト分書き込む)
stream.writeByte( 49); // 8bit整数値をセット( 1 バイト分書き込む)
stream.writeByte( 32); // 8bit整数値をセット( 1 バイト分書き込む)
stream.writeByte( 28); // 8bit整数値をセット( 1 バイト分書き込む)
stream.writeByte( 53); // 8bit整数値をセット( 1 バイト分書き込む)
stream.writeByte( 77); // 8bit整数値をセット( 1 バイト分書き込む)
trace(stream.position);
// ファイルストリームを閉じる
stream.close ();
// 一時的な作業用ファイルを削除
file.deleteFile ();
位置をスキップしながら部分的にアクセスしたい場合は、position プロパティを更新してから、読み書き用メソッドを呼び出します。
アクセス開始位置を変更してから、書き込み用メソッドを呼び出す (注意:ファイル操作を行います!! )
import flash.filesystem.File;
import flash.filesystem.FileStream;
import flash.filesystem.FileMode;
// 一時的な作業用ファイルを作成
var file : File = File.createTempFile();
// ファイルストリームオブジェクトを作成する
var stream : FileStream = new FileStream();
// 書き込みモードでファイルを開く
stream.open(file , FileMode.WRITE);
// アクセス開始位置を 0 番目に移動
stream.position = 0;
// 8bit整数値をセット( 1 バイト分書き込む)
stream.writeByte(0x12);
// アクセス開始位置を 24 番目に移動
stream.position = 24;
// 16bit整数値をセット( 2 バイト分書き込む)
stream.writeShort(0x1234);
// アクセス開始位置を 128 番目に移動
stream.position = 128;
// 32bit整数値をセット( 4 バイト分書き込む)
stream.writeInt(0x12345678);
// アクセス開始位置を 64 番目に移動
stream.position = 64;
// 適当な数値を 9 バイト分書き込む
stream.writeByte(136); // 8bit整数値をセット( 1 バイト分書き込む)
stream.writeByte(158); // 8bit整数値をセット( 1 バイト分書き込む)
stream.writeByte(198); // 8bit整数値をセット( 1 バイト分書き込む)
stream.writeByte(183); // 8bit整数値をセット( 1 バイト分書き込む)
stream.writeByte( 49); // 8bit整数値をセット( 1 バイト分書き込む)
stream.writeByte( 32); // 8bit整数値をセット( 1 バイト分書き込む)
stream.writeByte( 28); // 8bit整数値をセット( 1 バイト分書き込む)
stream.writeByte( 53); // 8bit整数値をセット( 1 バイト分書き込む)
stream.writeByte( 77); // 8bit整数値をセット( 1 バイト分書き込む)
// ファイルストリームを閉じる
stream.close ();
// 一時的な作業用ファイルを削除
file.deleteFile ();
■FileStream オブジェクトを作成する
new 演算子を使って、FileStream クラスをインスタンス化します。
FileStream オブジェクトを作成する
import flash.filesystem.FileStream;
// ファイルストリームオブジェクトを作成する
var stream : FileStream = new FileStream();
■ファイルのサイズを取得するには?
FileStream クラスには、length プロパティがありません。
ファイルを開く
■ファイルを開く(同期実行)
メディアに直接アクセスして、ファイルの読み書き処理を行います。
open() メソッドを使ってファイルを開くと、「読み込み用メソッド」「書き込み用メソッド」「close() メソッド」が、同期実行となります。
各メソッドの処理が完了するまで、制御が返りません。
FileStream.open ( File , FileMode.* ) :void
第01引数 | File | File オブジェクトを指定します。 |
第02引数 | String | ファイルを編集するモードを指定します。FileMode.* |
戻り値 | void | なし |
■第02引数 ファイル編集モード
第02引数で設定するファイル編集モードの種類です。
定数 | 文字 | 読込 | 書込 | その他の効果 |
FileMode. | "read" | ○ | × | なし |
FileMode. | "write" | × | ○ | ファイルをクリアしてから開く |
FileMode. | "append" | × | ○ | ファイルを開いて、位置を最後尾に移動する(上書き) |
FileMode. | "update" | ○ | ○ | ファイルを開いて、位置を先頭に移動する(上書き) |
■使用例
UPDATEモードで編集する例です。
一時的な作業用ファイルを作成して上書きモードで開く (注意:ファイル操作を行います!! )
import flash.filesystem.File;
import flash.filesystem.FileStream;
import flash.filesystem.FileMode;
// 一時的な作業用ファイルを作成する
var file : File = File.createTempFile();
// ファイルストリームオブジェクトを作成する
var file_stream : FileStream = new FileStream();
// 上書きモードで開く
file_stream.open(file , FileMode.UPDATE);
// -----------------------------------------
//
// ここでファイルの読み書き処理を行う
//
//-----------------------------------------
// ファイルストリームを閉じる
file_stream.close ();
// 一時的な作業用ファイルを削除
file.deleteFile ();
■ファイルを開くのに失敗したか調べる
ファイルを開くのに失敗した場合、エラーが発生します。
「他のアプリがファイルを使用中」、「ファイルを開くために必要なアクセス権が無い」などの場合、ファイルを開くのに失敗します。
ファイルを開くのに失敗したか調べる (注意:ファイル操作を行います!! )
import flash.filesystem.File;
import flash.filesystem.FileStream;
import flash.filesystem.FileMode;
// 一時的な作業用ファイルを作成する
var file : File = File.createTempFile();
// ファイルストリームオブジェクトを作成する
var file_stream : FileStream = new FileStream();
try {
// 上書きモードで開く
file_stream.open(file , FileMode.UPDATE);
// -----------------------------------------
//
// ここでファイルの読み書き処理を行う
//
//-----------------------------------------
// ファイルストリームを閉じる
file_stream.close ();
// 一時的な作業用ファイルを削除
file.deleteFile ();
}catch(e:Error){
trace("エラー");
}
■ファイルを開く(非同期実行)
ファイルを開いて、データの読み書きが可能な状態にするには、openAsync() メソッドを使用します。
ファイルを開いた後は、close() メソッドを呼び出して、必ずファイルを閉じる必要があります。
FileStream.openAsync ( File , FileMode.* ) :void
第01引数 | File | File オブジェクトを指定します。 |
第02引数 | String | ファイルを編集するモードを指定します。FileMode.* |
戻り値 | void | なし |
■第02引数 ファイル編集モード
第02引数で設定するファイル編集モードの種類です。
定数 | 文字 | 読込 | 書込 | その他の効果 |
FileMode. | "read" | ○ | × | なし |
FileMode. | "write" | × | ○ | ファイルをクリアしてから開く |
FileMode. | "append" | × | ○ | ファイルを開いて、位置を最後尾に移動する(上書き) |
FileMode. | "update" | ○ | ○ | ファイルを開いて、位置を先頭に移動する(上書き) |
■使用例
READモードで編集する例です。
一時的な作業用ファイルを作成して、読み込みモードで開く(非同期) (注意:ファイル操作を行います!! )
import flash.filesystem.File;
import flash.filesystem.FileStream;
import flash.filesystem.FileMode;
// 一時的な作業用ファイルを作成する
var file : File = File.createTempFile();
// ファイルストリームオブジェクトを作成する
var file_stream : FileStream = new FileStream();
// 読み込みモードで開く(非同期)
file_stream.openAsync(file , FileMode.READ);
// -----------------------------------------
//
// ここでファイルの読み書き処理を行う
//
//-----------------------------------------
// ファイルストリームを閉じる
file_stream.close ();
// 一時的な作業用ファイルを削除
file.deleteFile ();
■ファイルを開くのに失敗したか調べる
ファイルを開くのに失敗したか調べるには、IOErrorEvent.IO_ERROR イベントを使用します。
「他のアプリがファイルを使用中」、「ファイルを開くために必要なアクセス権が無い」などの場合、ファイルを開くのに失敗します。
ファイルを開くのに失敗したか調べる (注意:ファイル操作を行います!! )
import flash.filesystem.File;
import flash.filesystem.FileStream;
import flash.filesystem.FileMode;
import flash.events.IOErrorEvent;
// 一時的な作業用ファイルを作成する
var file : File = File.createTempFile();
// ファイルストリームオブジェクトを作成する
var file_stream : FileStream = new FileStream();
// 入出力エラー時に呼び出されるイベント
file_stream.addEventListener(IOErrorEvent.IO_ERROR, FileIOErrorFunc);
function FileIOErrorFunc(e:IOErrorEvent):void{
trace("入出力エラー");
}
// 上書きモードで開く(非同期)
file_stream.openAsync(file , FileMode.UPDATE);
// ファイルストリームを閉じる
file_stream.close ();
// 一時的な作業用ファイルを削除
file.deleteFile ();
■openAsync()メソッドの読み込み時の動作
読み込み用メソッドは、好きなタイミングで呼び出せるとは限りません。
読み込み用メソッドを呼び出すためには、読み込みバッファの管理を行い、メモリ上(読み込みバッファ)の領域が満たされるまで待つ必要があります。
■openAsync()メソッドの読み込み時の仕様
openAsync() メソッドの第02引数に、読み込み属性を持つ編集モードを指定して、ファイルを開きます。
するとメディアにあるファイルの中身が、高速なメモリ上(読み込みバッファ)に、自動的に読み込まれます。
この遅延読み込みは、非同期で動作します。
読み込み用メソッドを使用すると、メモリ上(読み込みバッファ)からデータを読み込むことができます。
アクセス可能な範囲は、メモリ上(読み込みバッファ)に蓄積されている分のみです。それ以外の範囲にアクセスするとエラーとなります。
この読み込みは、同期実行です。
■読み込みバッファを管理する
読み込みバッファのサイズを変更するには、readAhead プロパティを使用します。
デフォルトでは無制限です。
ファイルのアクセス開始位置を変更して、読み込みバッファを更新する場合は、position プロパティを変更します。
position プロパティを変更した場合、古いバッファは破棄され、新しいデータがバッファに読み込まれます。
読み書き用メソッドを使用して、アクセス開始位置を進めた場合でも、同様の動作となります。
バッファがどれだけ溜まったか調べるには、bytesAvailable プロパティを使用します。
position プロパティは、読み込み可能な開始位置を意味します。
bytesAvailable プロパティは、読み込み可能なサイズを意味します。
これらのプロパティを調べて、読み込みたい範囲内である場合に限って、読み込みメソッドの利用が可能です。
■読み込みバッファのイベント
読み込みバッファの進捗状況を調べるには、ProgressEvent.PROGRESS イベントを使用します。
読み込みバッファが更新されるたびに、呼び出されます。
「読み込みバッファ」への読み込みが、ファイルの最後尾に到達したか調べるには、ProgressEvent.COMPLETE イベントを使用します。
openAsync() メソッドで、読み込み属性を持つ編集モードの場合に動作するイベント (注意:ファイル操作を行います!! )
import flash.filesystem.File;
import flash.filesystem.FileStream;
import flash.filesystem.FileMode;
import flash.utils.ByteArray;
import flash.events.Event;
import flash.events.ProgressEvent;
import flash.events.IOErrorEvent;
// ------------------------------------------------------------
// 一時的な作業用ファイルを作成する
// ------------------------------------------------------------
var file : File = File.createTempFile();
// ファイルストリームオブジェクトを作成する
var file_stream : FileStream = new FileStream();
// ------------------------------------------------------------
// 書き込みテスト
// ------------------------------------------------------------
// WRITE モードで開く(同期実行)
file_stream.open (file , FileMode.WRITE);
// 10 MByte 相当のバッファを用意する
var tmp_buffer:ByteArray = new ByteArray();
tmp_buffer.position = 1024 * 1024 * 10;
tmp_buffer.writeByte(0xFF);
// ファイルにデータを書き込む
file_stream.writeBytes (tmp_buffer,0,tmp_buffer.length);
// ファイルストリームを閉じる
file_stream.close ();
// ------------------------------------------------------------
// 入出力エラー時に呼び出されるイベント
// ------------------------------------------------------------
file_stream.addEventListener(IOErrorEvent.IO_ERROR , FileIOErrorFunc);
function FileIOErrorFunc(e:IOErrorEvent):void{
trace("入出力エラー");
}
// ------------------------------------------------------------
// 「メディア」から「読み込みバッファ」へ、遅延読み込み中に呼び出されるイベント
// ------------------------------------------------------------
file_stream.addEventListener(ProgressEvent.PROGRESS , FileProgressFunc);
function FileProgressFunc(e:ProgressEvent):void{
trace ("遅延読み込み中 …");
trace ("ファイルの位置:" + e.bytesLoaded);
trace ("ファイルの総サイズ:" + e.bytesTotal);
trace ("パーセント:" + Math.floor(e.bytesLoaded/e.bytesTotal*100));
trace ("読み込み用メソッドがアクセス可能な位置:" + file_stream.position);
trace ("読み込み用メソッドがアクセス可能なサイズ:" + file_stream.bytesAvailable);
}
// ------------------------------------------------------------
// 「読み込みバッファ」への遅延読み込みが、ファイルの最後尾に到達した時に呼び出されるイベント
// ------------------------------------------------------------
file_stream.addEventListener(Event.COMPLETE , FileCompleteFunc);
function FileCompleteFunc(e:Event):void{
trace("「読み込みバッファ」への遅延読み込みが、ファイルの最後尾に到達した");
// ------------------------------------------------------------
// ファイルストリームを閉じる(非同期実行。実際に閉じられるタイミングは、Event.CLOSE イベントを使って検出する)
// ------------------------------------------------------------
file_stream.close();
trace("ファイルを閉じるメソッドを実行した(この時点では実際に閉じられていない)");
}
// ------------------------------------------------------------
// ファイルストリームが閉じられたときに実行されるイベント
// ------------------------------------------------------------
file_stream.addEventListener(Event.CLOSE , FileCloseFunc);
function FileCloseFunc(e:Event):void {
trace("ファイルを閉じる処理が完了した。");
}
// ------------------------------------------------------------
// 読み込みモードで開く(非同期)
// ------------------------------------------------------------
file_stream.openAsync (file , FileMode.READ);
■非同期でファイルを読み込む例
読み込みバッファのサイズを指定して、少しずつ読み込んで、非同期読み込みを実現する例です。
読み込みバッファの上限サイズを 8192 byte として少しずつ読み込む (注意:ファイル操作を行います!! )
import flash.filesystem.File;
import flash.filesystem.FileStream;
import flash.filesystem.FileMode;
import flash.utils.ByteArray;
import flash.events.Event;
import flash.events.ProgressEvent;
import flash.events.IOErrorEvent;
// ------------------------------------------------------------
// 一時的な作業用ファイルを作成する
// ------------------------------------------------------------
var file : File = File.createTempFile();
// ------------------------------------------------------------
// 書き込みテスト
// ------------------------------------------------------------
// ファイルストリームオブジェクトを作成する
var file_stream : FileStream = new FileStream();
// WRITE モードで開く(同期実行)
file_stream.open (file , FileMode.WRITE);
// 10 MByte 相当のバッファを用意する
var tmp_buffer:ByteArray = new ByteArray();
tmp_buffer.position = 1024 * 1024 * 10;
tmp_buffer.writeByte(0xFF);
// ファイルにデータを書き込む
file_stream.writeBytes (tmp_buffer,0,tmp_buffer.length);
// ファイルストリームを閉じる
file_stream.close ();
// ------------------------------------------------------------
// ファイルの読み込み先となるバッファを作成する
// ------------------------------------------------------------
var buffer : ByteArray = new ByteArray();
// ------------------------------------------------------------
// 読み込みバッファのサイズを指定
// ------------------------------------------------------------
file_stream.readAhead = 8192;
// ------------------------------------------------------------
// 入出力エラー時に呼び出されるイベント
// ------------------------------------------------------------
file_stream.addEventListener(IOErrorEvent.IO_ERROR, FileIOErrorFunc);
function FileIOErrorFunc(e:IOErrorEvent):void{
trace("入出力エラー");
}
// ------------------------------------------------------------
// 「メディア」から「読み込みバッファ」へ、遅延読み込み中に呼び出されるイベント
// ------------------------------------------------------------
file_stream.addEventListener(ProgressEvent.PROGRESS, FileProgressFunc);
function FileProgressFunc(e:ProgressEvent):void{
trace ("遅延読み込み中 …");
trace ("パーセント:" + Math.floor(e.bytesLoaded/e.bytesTotal*100));
// ------------------------------------------------------------
// 「読み込みバッファ」から「アクセス可能な分」を読み込む(同期実行)
// ------------------------------------------------------------
file_stream.readBytes(buffer , buffer.length , file_stream.bytesAvailable);
}
// ------------------------------------------------------------
// 「読み込みバッファ」への遅延読み込みが、ファイルの最後尾に到達した時に呼び出されるイベント
// ------------------------------------------------------------
file_stream.addEventListener(Event.COMPLETE, FileCompleteFunc);
function FileCompleteFunc(e:Event):void{
trace("「読み込みバッファ」への遅延読み込みが、ファイルの最後尾に到達した")
trace("読み込んだバイナリのサイズ:" + buffer.length)
// ------------------------------------------------------------
// ファイルストリームを閉じる(非同期実行。実際に閉じられるタイミングは、Event.CLOSE イベントを使って検出する)
// ------------------------------------------------------------
file_stream.close ();
trace("ファイルを閉じるメソッドを実行した(この時点では実際に閉じられていない)");
}
// ------------------------------------------------------------
// ファイルストリームが閉じられたときに実行されるイベント
// ------------------------------------------------------------
file_stream.addEventListener(Event.CLOSE , FileCloseFunc);
function FileCloseFunc(e:Event):void {
trace("ファイルを閉じる処理が完了した。");
}
// ------------------------------------------------------------
// 読み込みモードで開く(非同期)
// ------------------------------------------------------------
file_stream.openAsync (file , FileMode.READ);
■openAsync()メソッドの書き込み時の動作
書き込み用メソッドは、好きなタイミングで呼び出す事ができます。
実際に書き込みが完了したかは、イベントを使って調べます。
■openAsync()メソッドの書き込み時の仕様
書き込み用メソッドを呼び出すと、高速なメモリ上(書き込み用バッファ)に書き込まれます。
この書き込みは、同期実行です。
よって、書き込み用メソッドを呼び出した直後に、出力データが格納された変数を変更しても問題ありません。
その後、メモリ上(書き込み用バッファ)から、メディアにあるファイルに、自動的に書き込まれます。
この遅延書き込みは、非同期で動作します。
遅延書き込み中は、プログラムが動き続けます。
遅延書込み中に、AIR アプリケーションを終了すると、メディアへの書き込みが途中で中断するため、ファイルが破損します。
よって、必ずイベントを使って実行結果を得る必要があります。
■書き込みバッファのイベント
メモリ上(書き込み用バッファ)から、メディアへの遅延書き込みの進捗状況を調べるには、OutputProgressEvent.OUTPUT_PROGRESS イベントを使用します。
遅延書き込み処理の残りのバイト数を調べるには、bytesPending プロパティを使用します。
「書き込みバッファ」に書き込まれた総バイト数を調べるには、bytesTotal プロパティを使用します。
bytesPending プロパティが 0 である場合、遅延書き込み処理が完了しています。
■非同期でファイルに書き込む例
非同期でファイルに書き込む (注意:ファイル操作を行います!! )
import flash.filesystem.File;
import flash.filesystem.FileStream;
import flash.filesystem.FileMode;
import flash.utils.ByteArray;
import flash.events.Event;
import flash.events.OutputProgressEvent;
import flash.events.IOErrorEvent;
// ------------------------------------------------------------
// 一時的な作業用ファイルを作成する
// ------------------------------------------------------------
var file : File = File.createTempFile();
// ファイルストリームオブジェクトを作成する
var file_stream : FileStream = new FileStream();
// ------------------------------------------------------------
// 入出力エラー時に呼び出されるイベント
// ------------------------------------------------------------
file_stream.addEventListener(IOErrorEvent.IO_ERROR , FileIOErrorFunc);
function FileIOErrorFunc(e:IOErrorEvent):void{
trace("入出力エラー")
}
// ------------------------------------------------------------
// 「書き込みバッファ」から「メディア」へ遅延書き込み中に呼び出されるイベント
// ------------------------------------------------------------
file_stream.addEventListener(OutputProgressEvent.OUTPUT_PROGRESS , FileOutputProgressFunc);
function FileOutputProgressFunc(e:OutputProgressEvent):void{
trace ("遅延書き込み中 …");
trace ("残り:" + e.bytesPending);
trace ("全体:" + e.bytesTotal);
trace ("パーセント:" + Math.floor((1-(e.bytesPending/e.bytesTotal))*100));
if(e.bytesPending == 0){
trace("「書き込みバッファ」から「メディア」への、遅延書き込み処理が完了した");
}
}
// ------------------------------------------------------------
// ファイルストリームが閉じられたときに実行されるイベント
// ------------------------------------------------------------
file_stream.addEventListener(Event.CLOSE , FileCloseFunc);
function FileCloseFunc(e:Event):void {
trace("ファイルを閉じる処理が完了した。");
}
// ------------------------------------------------------------
// WRITE モードで開く(非同期)
// ------------------------------------------------------------
file_stream.openAsync (file , FileMode.WRITE);
// ------------------------------------------------------------
// テスト書き込み
// ------------------------------------------------------------
// 10 MByte 相当の適当なバッファを用意する
var tmp_buffer:ByteArray = new ByteArray();
tmp_buffer.position = 1024 * 1024 * 10;
tmp_buffer.writeByte(0xFF);
// ファイルにデータを書き込む
file_stream.writeBytes (tmp_buffer,0,tmp_buffer.length);
trace("「書き込みバッファ」へ「10 MByte 相当のデータ」の書き込みが完了した");
// ------------------------------------------------------------
// ファイルストリームを閉じる(非同期実行。実際に閉じられるタイミングは、Event.CLOSE イベントを使って検出する)
// ------------------------------------------------------------
file_stream.close ();
trace("ファイルを閉じるメソッドを実行した(この時点では実際に閉じられていない)");
ファイルを閉じる
■ファイルを閉じる
ファイルを閉じるには、close() メソッドを使用します。
■開いたファイルは必ず閉じる
open() メソッドや openAsync() メソッドを使用してファイルを開いた後は、必ずファイルを閉じる必要があります。
ファイルを開いている間は、そのファイルがロック(排他)状態となります。
ファイルがロック(排他)状態である場合、別のアプリからアクセスを試みると失敗するようになります。
必要もないのにファイルを開いたまま放置すると、別のアプリに迷惑が掛かるので注意して下さい。
また、ファイルを開いている間は、OS のファイルハンドルを1つ消費します。
ファイルを閉じ忘れたり、ファイルを大量に開いたまま放置すると、OS の資源が枯渇していきます。
■open() メソッドを使って開いたファイルを閉じる例
open() メソッドを使って開いたファイルを閉じる (注意:ファイル操作を行います!! )
import flash.filesystem.File;
import flash.filesystem.FileStream;
import flash.filesystem.FileMode;
// ------------------------------------------------------------
// 一時的な作業用ファイルを作成する
// ------------------------------------------------------------
var file : File = File.createTempFile();
// ファイルストリームオブジェクトを作成する
var file_stream : FileStream = new FileStream();
// ------------------------------------------------------------
// 読み込みモードで開く
// ------------------------------------------------------------
file_stream.open (file , FileMode.READ);
// ------------------------------------------------------------
// ファイルストリームを閉じる(同期実行。実際に閉じられる。)
// ------------------------------------------------------------
file_stream.close();
■ openAsync() メソッドを使って開いたファイルを閉じる場合
close() メソッドは、好きなタイミングで呼び出す事ができます。
ファイルを閉じる処理が完了したかは、イベントを使って調べます。
■openAsync()メソッドを使って開いたファイルを閉じる場合の仕様
ファイルへの遅延書き込み処理が動作している場合、すべて完了するまで実際にファイルが閉じられる事はありません。
ファイルを閉じる処理が完了する前に、AIR アプリケーションを終了すると、メディアへの書き込みが途中で中断するため、ファイルが破損します。
よって、必ずイベントを使って実行結果を得る必要があります。
ファイルストリームが閉じられたか調べるには、Event.CLOSE イベントを使用します。
■openAsync() メソッドを使って開いたファイルを閉じる例
openAsync() メソッドを使って開いたファイルを閉じる (注意:ファイル操作を行います!! )
import flash.filesystem.File;
import flash.filesystem.FileStream;
import flash.filesystem.FileMode;
import flash.events.Event;
// ------------------------------------------------------------
// 一時的な作業用ファイルを作成する
// ------------------------------------------------------------
var file : File = File.createTempFile();
// ファイルストリームオブジェクトを作成する
var file_stream : FileStream = new FileStream();
// ------------------------------------------------------------
// 書き込みモードで開く(非同期)
// ------------------------------------------------------------
file_stream.openAsync (file , FileMode.WRITE);
// ------------------------------------------------------------
// ファイルストリームが閉じられたときに実行されるイベント
// ------------------------------------------------------------
file_stream.addEventListener(Event.CLOSE , FileCloseFunc);
function FileCloseFunc(e:Event):void {
trace("ファイルを閉じる処理が完了した。");
}
// ------------------------------------------------------------
// ファイルストリームを閉じる(非同期実行。実際に閉じられるタイミングは、Event.CLOSE イベントを使って検出する)
// ------------------------------------------------------------
file_stream.close ();
データの読み込みを行なう
サンプルをダウンロード
■読み込みメソッドについて
読み込みメソッドを使用すると、フォーマットに従ったデータを読み取る事ができます。
下にメソッドの一覧があります。
■Boolean の読み込みメソッド
読み込み時に使用できるメソッドの一覧です。
メソッド名 | 型 | 説明 |
readBoolean | Boolean | Boolean 型として読み込む |
■数値系の読み込みメソッド
読み込み時に使用できるメソッドの一覧です。
符号のありなしで2つずつ用意されている物があります。
メソッド名 | 型 | 説明 |
readUnsignedByte | uint | 8bit整数(符号なし)として読み込む |
readByte | int | 8bit整数(符号あり)として読み込む |
readUnsignedShort | uint | 16bit整数(符号なし)として読み込む |
readShort | int | 16bit整数(符号あり)として読み込む |
readUnsignedInt | uint | 32bit整数(符号なし)として読み込む |
readInt | int | 32bit整数(符号あり)として読み込む |
readFloat | Number | 32bit浮動小数点数として読み込む |
readDouble | Number | 64bit浮動小数点数として読み込む |
■文字列系の読み込みメソッド
文字列読み込み時に使用できるメソッドの一覧です。
メソッド名 | 型 | 説明 |
readUTF | String | UTF-8文字列として読み込む。 (先頭2バイトでバイト数、以降に文字データがバイト数分格納されたフォーマットである事) |
readUTFBytes | String | UTF-8文字列として読み込む(読み込むサイズを引数で指定) |
readMultiByte | String | 文字コードを指定して文字列として読み込む(読み込むサイズを引数) |
■Object の読み込みメソッド
読み込んで、配列や Object 型の状態に復元します。デシリアライズと呼ばれる機能です。
メソッド名 | 型 | 説明 |
readObject | Object | オブジェクトとして読み込む(AMF 直列化形式) |
■ByteArray の読み込みメソッド
ByteArray 型として読み込みます。
メソッド名 | 型 | 説明 |
readBytes | ByteArray | ByteArray型で読み込む |
■readBoolean() メソッド
Boolean 型として、1バイト分読み込みます。
0 なら false
0 以外の数値なら true となります。
Boolean型として1バイト分読み込む (注意:ファイル操作を行います!! )
import flash.filesystem.File;
import flash.filesystem.FileStream;
import flash.filesystem.FileMode;
// 一時的な作業用ファイルを作成
var file : File = File.createTempFile();
// ファイルストリームオブジェクトを作成する
var stream : FileStream = new FileStream();
// ------------------------------------------------------------
// 書き込みテスト
// ------------------------------------------------------------
// 書き込みモードで開く
stream.open(file , FileMode.WRITE);
stream.writeBoolean(false); // Boolean型として書き込む
stream.writeBoolean(true); // Boolean型として書き込む
// ファイルストリームを閉じる
stream.close ();
// ------------------------------------------------------------
// 読み込みテスト
// ------------------------------------------------------------
// 読み込みモードで開く
stream.open(file , FileMode.READ);
// アクセス開始位置を 0 へ
stream.position = 0;
var value0 : Boolean = stream.readBoolean(); // Boolean型として読み込む
var value1 : Boolean = stream.readBoolean(); // Boolean型として読み込む
// ファイルストリームを閉じる
stream.close ();
// ------------------------------------------------------------
// トレーステスト
// ------------------------------------------------------------
trace(value0);
trace(value1);
// 一時的な作業用ファイルを削除
file.deleteFile ();
■readUnsignedByte() メソッド
8bit整数(符号なし)として、1バイト分読み込みます。
8bit整数(符号なし)として読み込む (注意:ファイル操作を行います!! )
import flash.filesystem.File;
import flash.filesystem.FileStream;
import flash.filesystem.FileMode;
// 一時的な作業用ファイルを作成
var file : File = File.createTempFile();
// ファイルストリームオブジェクトを作成する
var stream : FileStream = new FileStream();
// ------------------------------------------------------------
// 書き込みテスト
// ------------------------------------------------------------
// 書き込みモードで開く
stream.open(file , FileMode.WRITE);
stream.writeByte(12);// 8bit整数として書き込む
stream.writeByte(34);// 8bit整数として書き込む
// ファイルストリームを閉じる
stream.close ();
// ------------------------------------------------------------
// 読み込みテスト
// ------------------------------------------------------------
// 読み込みモードで開く
stream.open(file , FileMode.READ);
// アクセス開始位置を 0 へ
stream.position = 0;
var value0 : uint = stream.readUnsignedByte(); // 8bit整数(符号なし)として読み込む
var value1 : uint = stream.readUnsignedByte(); // 8bit整数(符号なし)として読み込む
// ファイルストリームを閉じる
stream.close ();
// ------------------------------------------------------------
// トレーステスト
// ------------------------------------------------------------
trace(value0);
trace(value1);
// 一時的な作業用ファイルを削除
file.deleteFile ();
■readByte() メソッド
8bit整数(符号あり)として、1バイト分読み込みます。
8bit整数(符号あり)として読み込む (注意:ファイル操作を行います!! )
import flash.filesystem.File;
import flash.filesystem.FileStream;
import flash.filesystem.FileMode;
// 一時的な作業用ファイルを作成
var file : File = File.createTempFile();
// ファイルストリームオブジェクトを作成する
var stream : FileStream = new FileStream();
// ------------------------------------------------------------
// 書き込みテスト
// ------------------------------------------------------------
// 書き込みモードで開く
stream.open(file , FileMode.WRITE);
stream.writeByte(-32); // 8bit整数として書き込む
stream.writeByte(45); // 8bit整数として書き込む
// ファイルストリームを閉じる
stream.close ();
// ------------------------------------------------------------
// 読み込みテスト
// ------------------------------------------------------------
// 読み込みモードで開く
stream.open(file , FileMode.READ);
// アクセス開始位置を 0 へ
stream.position = 0;
var value0 : int = stream.readByte(); // 8bit整数(符号あり)として読み込む
var value1 : int = stream.readByte(); // 8bit整数(符号あり)として読み込む
// ファイルストリームを閉じる
stream.close ();
// ------------------------------------------------------------
// トレーステスト
// ------------------------------------------------------------
trace(value0);
trace(value1);
// 一時的な作業用ファイルを削除
file.deleteFile ();
■readUnsignedShort() メソッド
16bit整数(符号なし)として、2バイト分読み込みます。
16bit整数(符号なし)として読み込む (注意:ファイル操作を行います!! )
import flash.filesystem.File;
import flash.filesystem.FileStream;
import flash.filesystem.FileMode;
// 一時的な作業用ファイルを作成
var file : File = File.createTempFile();
// ファイルストリームオブジェクトを作成する
var stream : FileStream = new FileStream();
// ------------------------------------------------------------
// 書き込みテスト
// ------------------------------------------------------------
// 書き込みモードで開く
stream.open(file , FileMode.WRITE);
stream.writeByte(0x12); // 8bit整数として書き込む
stream.writeByte(0x34); // 8bit整数として書き込む
// ファイルストリームを閉じる
stream.close ();
// ------------------------------------------------------------
// 読み込みテスト
// ------------------------------------------------------------
// 読み込みモードで開く
stream.open(file , FileMode.READ);
// アクセス開始位置を 0 へ
stream.position = 0;
var value : uint = stream.readUnsignedShort(); // 16bit整数(符号なし)として読み込む
// ファイルストリームを閉じる
stream.close ();
// ------------------------------------------------------------
// トレーステスト
// ------------------------------------------------------------
trace((value).toString(16)); // 16進数表示
// 一時的な作業用ファイルを削除
file.deleteFile ();
■readShort() メソッド
16bit整数(符号あり)として、2バイト分読み込みます。
16bit整数(符号あり)として読み込む (注意:ファイル操作を行います!! )
import flash.filesystem.File;
import flash.filesystem.FileStream;
import flash.filesystem.FileMode;
// 一時的な作業用ファイルを作成
var file : File = File.createTempFile();
// ファイルストリームオブジェクトを作成する
var stream : FileStream = new FileStream();
// ------------------------------------------------------------
// 書き込みテスト
// ------------------------------------------------------------
// 書き込みモードで開く
stream.open(file , FileMode.WRITE);
stream.writeByte(-32); // 8bit整数として書き込む
stream.writeByte(0x00); // 8bit整数として書き込む
// ファイルストリームを閉じる
stream.close ();
// ------------------------------------------------------------
// 読み込みテスト
// ------------------------------------------------------------
// 読み込みモードで開く
stream.open(file , FileMode.READ);
// アクセス開始位置を 0 へ
stream.position = 0;
var value : int = stream.readShort(); // 16bit整数(符号あり)として読み込む
// ファイルストリームを閉じる
stream.close ();
// ------------------------------------------------------------
// トレーステスト
// ------------------------------------------------------------
trace(value);
// 一時的な作業用ファイルを削除
file.deleteFile ();
■readUnsignedInt() メソッド
32bit整数(符号なし)として、4バイト分読み込みます。
32bit整数(符号なし)として読み込む (注意:ファイル操作を行います!! )
import flash.filesystem.File;
import flash.filesystem.FileStream;
import flash.filesystem.FileMode;
// 一時的な作業用ファイルを作成
var file : File = File.createTempFile();
// ファイルストリームオブジェクトを作成する
var stream : FileStream = new FileStream();
// ------------------------------------------------------------
// 書き込みテスト
// ------------------------------------------------------------
// 書き込みモードで開く
stream.open(file , FileMode.WRITE);
stream.writeByte(0x12); // 8bit整数として書き込む
stream.writeByte(0x34); // 8bit整数として書き込む
stream.writeByte(0x56); // 8bit整数として書き込む
stream.writeByte(0x78); // 8bit整数として書き込む
// ファイルストリームを閉じる
stream.close ();
// ------------------------------------------------------------
// 読み込みテスト
// ------------------------------------------------------------
// 読み込みモードで開く
stream.open(file , FileMode.READ);
// アクセス開始位置を 0 へ
stream.position = 0;
var value : uint = stream.readUnsignedInt(); // 32bit整数(符号なし)として読み込む
// ファイルストリームを閉じる
stream.close ();
// ------------------------------------------------------------
// トレーステスト
// ------------------------------------------------------------
trace((value).toString(16)); // 16進数表示
// 一時的な作業用ファイルを削除
file.deleteFile ();
■readInt() メソッド
32bit整数(符号あり)として、4バイト分読み込みます。
32bit整数(符号あり)として読み込む (注意:ファイル操作を行います!! )
import flash.filesystem.File;
import flash.filesystem.FileStream;
import flash.filesystem.FileMode;
// 一時的な作業用ファイルを作成
var file : File = File.createTempFile();
// ファイルストリームオブジェクトを作成する
var stream : FileStream = new FileStream();
// ------------------------------------------------------------
// 書き込みテスト
// ------------------------------------------------------------
// 書き込みモードで開く
stream.open(file , FileMode.WRITE);
stream.writeByte(-32); // 8bit整数として書き込む
stream.writeByte(0x00); // 8bit整数として書き込む
stream.writeByte(0x00); // 8bit整数として書き込む
stream.writeByte(0x00); // 8bit整数として書き込む
// ファイルストリームを閉じる
stream.close ();
// ------------------------------------------------------------
// 読み込みテスト
// ------------------------------------------------------------
// 読み込みモードで開く
stream.open(file , FileMode.READ);
// アクセス開始位置を 0 へ
stream.position = 0;
var value : int = stream.readInt(); // 32bit整数(符号あり)として読み込む
// ファイルストリームを閉じる
stream.close ();
// ------------------------------------------------------------
// トレーステスト
// ------------------------------------------------------------
trace(value);
// 一時的な作業用ファイルを削除
file.deleteFile ();
■readFloat() メソッド
32bit浮動小数点数として、4バイト分読み込みます。
32bit浮動小数点数として読み込む (注意:ファイル操作を行います!! )
import flash.filesystem.File;
import flash.filesystem.FileStream;
import flash.filesystem.FileMode;
// 一時的な作業用ファイルを作成
var file : File = File.createTempFile();
// ファイルストリームオブジェクトを作成する
var stream : FileStream = new FileStream();
// ------------------------------------------------------------
// 書き込みテスト
// ------------------------------------------------------------
// 書き込みモードで開く
stream.open(file , FileMode.WRITE);
stream.writeByte(0x3F); // 8bit整数として書き込む
stream.writeByte(0x80); // 8bit整数として書き込む
stream.writeByte(0x00); // 8bit整数として書き込む
stream.writeByte(0x01); // 8bit整数として書き込む
// ファイルストリームを閉じる
stream.close ();
// ------------------------------------------------------------
// 読み込みテスト
// ------------------------------------------------------------
// 読み込みモードで開く
stream.open(file , FileMode.READ);
// アクセス開始位置を 0 へ
stream.position = 0;
var value : Number = stream.readFloat(); // 32bit浮動小数点数として読み込む
// ファイルストリームを閉じる
stream.close ();
// ------------------------------------------------------------
// トレーステスト
// ------------------------------------------------------------
trace(value);
// 一時的な作業用ファイルを削除
file.deleteFile ();
■readDouble() メソッド
64bit浮動小数点数として8バイト分読み込みます。
64bit浮動小数点数として読み込む (注意:ファイル操作を行います!! )
import flash.filesystem.File;
import flash.filesystem.FileStream;
import flash.filesystem.FileMode;
// 一時的な作業用ファイルを作成
var file : File = File.createTempFile();
// ファイルストリームオブジェクトを作成する
var stream : FileStream = new FileStream();
// ------------------------------------------------------------
// 書き込みテスト
// ------------------------------------------------------------
// 書き込みモードで開く
stream.open(file , FileMode.WRITE);
stream.writeByte(0x3F); // 8bit整数として書き込む
stream.writeByte(0xF0); // 8bit整数として書き込む
stream.writeByte(0x00); // 8bit整数として書き込む
stream.writeByte(0x00); // 8bit整数として書き込む
stream.writeByte(0x00); // 8bit整数として書き込む
stream.writeByte(0x00); // 8bit整数として書き込む
stream.writeByte(0x00); // 8bit整数として書き込む
stream.writeByte(0x01); // 8bit整数として書き込む
// ファイルストリームを閉じる
stream.close ();
// ------------------------------------------------------------
// 読み込みテスト
// ------------------------------------------------------------
// 読み込みモードで開く
stream.open(file , FileMode.READ);
// アクセス開始位置を 0 へ
stream.position = 0;
var value : Number = stream.readDouble(); // 64bit浮動小数点数として読み込む
// ファイルストリームを閉じる
stream.close ();
// ------------------------------------------------------------
// トレーステスト
// ------------------------------------------------------------
trace(value);
// 一時的な作業用ファイルを削除
file.deleteFile ();
■readUTF() メソッド
writeUTF()メソッドを使って書き込んだ UTF-8 文字列を、読み込むときに使用します。
AIR アプリ間で、 UTF-8 文字列をやり取りしたい場合は、こちらがお勧めです。
読み込み開始位置から、2バイト使用して「バイト数(16bit整数符号無し)」が埋め込まれている必要があります。
さらにそこから「バイト数」分だけ「UTF-8 文字データ」が続いている必要があります。
UTF-8 文字列として読み込む (注意:ファイル操作を行います!! )
import flash.filesystem.File;
import flash.filesystem.FileStream;
import flash.filesystem.FileMode;
// 一時的な作業用ファイルを作成
var file : File = File.createTempFile();
// ファイルストリームオブジェクトを作成する
var stream : FileStream = new FileStream();
// ------------------------------------------------------------
// 書き込みテスト
// ------------------------------------------------------------
// 書き込みモードで開く
stream.open(file , FileMode.WRITE);
stream.writeByte(0); // ┌
stream.writeByte(6); // └ 2バイトでバイト数
stream.writeByte(0x61); // ├ "a"
stream.writeByte(0x62); // ├ "b"
stream.writeByte(0x63); // ├ "c"(アルファベットは 1 バイト使用)
stream.writeByte(0xe3); // ┌
stream.writeByte(0x81); // │
stream.writeByte(0x82); // └ "あ"(日本語は 3 バイト使用) ※UTF-8 は可変バイト
// ファイルストリームを閉じる
stream.close ();
// ------------------------------------------------------------
// 読み込みテスト
// ------------------------------------------------------------
// 読み込みモードで開く
stream.open(file , FileMode.READ);
// アクセス開始位置を 0 へ
stream.position = 0;
var value : String = stream.readUTF(); // UTF-8 文字列として読み込む
// ファイルストリームを閉じる
stream.close ();
// ------------------------------------------------------------
// トレーステスト
// ------------------------------------------------------------
trace(value);
// 一時的な作業用ファイルを削除
file.deleteFile ();
■readUTFBytes() メソッド
UTF-8 文字列として読み込みます。
引数に、読み込むバイト数を指定する必要があります。(文字数ではない)
あらかじめ、UTF-8 文字列の総バイト数が分かってないと読み込めません。
読み込みたいファイルが、UTF-8 のテキスト形式であれば、ファイルサイズから総バイト数を知ることができます。
サイズを指定してUTF文字列として読み込む (注意:ファイル操作を行います!! )
import flash.filesystem.File;
import flash.filesystem.FileStream;
import flash.filesystem.FileMode;
// 一時的な作業用ファイルを作成
var file : File = File.createTempFile();
// ファイルストリームオブジェクトを作成する
var stream : FileStream = new FileStream();
// ------------------------------------------------------------
// 書き込みテスト
// ------------------------------------------------------------
// 書き込みモードで開く
stream.open(file , FileMode.WRITE);
stream.writeByte(0x61); // ├ "a"
stream.writeByte(0x62); // ├ "b"
stream.writeByte(0x63); // ├ "c"(アルファベットは1バイト使用)
stream.writeByte(0xe3); // ┌
stream.writeByte(0x81); // │
stream.writeByte(0x82); // └ "あ"(日本語は3バイト使用) ※UTF-8 は可変バイト
// ファイルストリームを閉じる
stream.close ();
// ------------------------------------------------------------
// 読み込みテスト
// ------------------------------------------------------------
// 読み込みモードで開く
stream.open(file , FileMode.READ);
// アクセス開始位置を 0 へ
stream.position = 0;
var value : String = stream.readUTFBytes(file.size); // UTF文字列として読み込む
// ファイルストリームを閉じる
stream.close ();
// ------------------------------------------------------------
// トレーステスト
// ------------------------------------------------------------
trace(value);
// 一時的な作業用ファイルを削除
file.deleteFile ();
■readMultiByte() メソッド
コードとバイト数を指定して、文字列として読み込みます。
第01引数に、読み込みたいバイト数を指定します。
第02引数に、読み込みたいコードを文字列で指定します。コード一覧は、以下の通りです。
コード | 文字列 |
日本語(EUC) | "euc-jp" |
日本語(JIS) | "iso-2022-jp" |
日本語(Shift-JIS) | "shift_jis" |
Unicode (UTF-16) | "unicode" |
その他の、文字コード一覧は、公式リファレンスが参考になります。
http://help.adobe.com/ja_JP/FlashPlatform/reference/actionscript/3/charset-codes.html
あらかじめ、文字列の総バイト数が分かってないと読み込めません。
読み込みたいファイルが、テキスト形式であれば、ファイルサイズから総バイト数を知ることができます。
Shift-JIS文字列として読み込む (注意:ファイル操作を行います!! )
import flash.filesystem.File;
import flash.filesystem.FileStream;
import flash.filesystem.FileMode;
// 一時的な作業用ファイルを作成
var file : File = File.createTempFile();
// ファイルストリームオブジェクトを作成する
var stream : FileStream = new FileStream();
// ------------------------------------------------------------
// 書き込みテスト
// ------------------------------------------------------------
// 書き込みモードで開く
stream.open(file , FileMode.WRITE);
stream.writeByte(0x61); // ├ "a"
stream.writeByte(0x62); // ├ "b"
stream.writeByte(0x63); // ├ "c"(アルファベットは1バイト使用)
stream.writeByte(0x82); // ┌
stream.writeByte(0xa0); // └ "あ"(日本語は2バイト使用)
// ファイルストリームを閉じる
stream.close ();
// ------------------------------------------------------------
// 読み込みテスト
// ------------------------------------------------------------
// 読み込みモードで開く
stream.open(file , FileMode.READ);
// アクセス開始位置を 0 へ
stream.position = 0;
var value : String = stream.readMultiByte(file.size,"shift_jis"); // Shift-JIS文字列として読み込む
// ファイルストリームを閉じる
stream.close ();
// ------------------------------------------------------------
// トレーステスト
// ------------------------------------------------------------
trace(value);
// 一時的な作業用ファイルを削除
file.deleteFile ();
■readObject() メソッド
writeObject()メソッドを使って書き込んだオブジェクトを、読み込むときに使用します。
デシリアライズと呼ばれる機能です。配列や Object を復元してくれます。
Object型として読み込む (注意:ファイル操作を行います!! )
import flash.filesystem.File;
import flash.filesystem.FileStream;
import flash.filesystem.FileMode;
// 一時的な作業用ファイルを作成
var file : File = File.createTempFile();
// ファイルストリームオブジェクトを作成する
var stream : FileStream = new FileStream();
// ------------------------------------------------------------
// 書き込みテスト
// ------------------------------------------------------------
// 書き込みモードで開く
stream.open(file , FileMode.WRITE);
var obj : Object = {
a : 0,
b : 1,
c : [2,3,4,5]
};
// Object型として書き込む
stream.writeObject(obj);
// ファイルストリームを閉じる
stream.close ();
// ------------------------------------------------------------
// 読み込みテスト
// ------------------------------------------------------------
// 読み込みモードで開く
stream.open(file , FileMode.READ);
// アクセス開始位置を 0 へ
stream.position = 0;
var value : Object = stream.readObject(); // Object型として読み込む
// ファイルストリームを閉じる
stream.close ();
// ------------------------------------------------------------
// トレーステスト
// ------------------------------------------------------------
trace(value.a);
trace(value.b);
trace(value.c);
// 一時的な作業用ファイルを削除
file.deleteFile ();
■readBytes() メソッド
ファイルから読み込んで、ByteArray オブジェクトに書き込みます。
第01引数に、書き込みたい ByteArray オブジェクトを指定します。
第02引数に、書き込みたい ByteArray オブジェクトの、書き込み開始位置を指定します。
第03引数に、ファイルから読み込むサイズ(ByteArray オブジェクトに書き込むサイズ)を指定します。
ファイルの読み込み開始位置は、position プロパティで設定します。
メソッド実行後、ByteArray オブジェクトの位置は変化しません。
ファイルから読み込んで、ByteArray オブジェクトに書き込む (注意:ファイル操作を行います!! )
import flash.filesystem.File;
import flash.filesystem.FileStream;
import flash.filesystem.FileMode;
import flash.utils.ByteArray;
// 一時的な作業用ファイルを作成
var file : File = File.createTempFile();
// ファイルストリームオブジェクトを作成する
var stream_src : FileStream = new FileStream();
// ------------------------------------------------------------
// 書き込みテスト
// ------------------------------------------------------------
// 書き込みモードで開く
stream_src.open(file , FileMode.WRITE);
stream_src.writeByte(0x00); // 8bit整数として書き込む
stream_src.writeByte(0x01); // 8bit整数として書き込む
stream_src.writeByte(0x02); // 8bit整数として書き込む
stream_src.writeByte(0x03); // 8bit整数として書き込む
stream_src.writeByte(0x04); // 8bit整数として書き込む
// ファイルストリームを閉じる
stream_src.close ();
// ------------------------------------------------------------
// 読み込みテスト
// ------------------------------------------------------------
// 読み込みモードで開く
stream_src.open(file , FileMode.READ);
// アクセス開始位置を 0 へ
stream_src.position = 0;
// 書き込み用 ByteArray オブジェクトを作成
var stream_out : ByteArray = new ByteArray();
// ファイルから、ファイルサイズ分読み込んで、ByteArray オブジェクトに書き込む
stream_src.readBytes(stream_out , 0 , file.size);
// ファイルストリームを閉じる
stream_src.close ();
// ------------------------------------------------------------
// トレーステスト
// ------------------------------------------------------------
var i:Number;
for(i=0;i < stream_out.length;i++){
trace(stream_out[i]);
}
// 一時的な作業用ファイルを削除
file.deleteFile ();
データの書き込みを行なう
サンプルをダウンロード
■書き込みメソッドについて
書き込みメソッドを使用すると、フォーマットに従ったデータを書き込む事ができます。
下にメソッドの一覧があります。
■Boolean の書き込みメソッド
書き込み時に使用できるメソッドの一覧です。
メソッド名 | 型 | 説明 |
writeBoolean | Boolean | Boolean 型として書き込む |
■数値系の書き込みメソッド
書き込み時に使用できるメソッドの一覧です。
Int 型のみ、符号のありなしで、2つのメソッドが用意されています。
メソッド名 | 型 | 説明 |
writeByte | int | 8bit整数(符号あり)として書き込む |
writeShort | int | 16bit整数(符号あり)として書き込む |
writeUnsignedInt | uint | 32bit整数(符号なし)として書き込む |
writeInt | int | 32bit整数(符号あり)として書き込む |
writeFloat | Number | 32bit浮動小数点数として書き込む |
writeDouble | Number | 64bit浮動小数点数として書き込む |
■文字列系の書き込みメソッド
文字列書き込み時に使用できるメソッドの一覧です。
writeUTF() メソッドは、文字列の総バイト数情報も同時に書き込めるので、AIR アプリ間でやり取りをしたい場合に便利です。
メソッド名 | 型 | 説明 |
writeUTF | String | UTF文字列として書き込む。 (先頭2バイトでバイト数、以降に文字データがバイト数分格納されたフォーマットである事) |
writeUTFBytes | String | UTF文字列として書き込む(書き込むサイズを引数で指定) |
writeMultiByte | String | 文字コードを指定して文字列として書き込む(書き込むサイズを引数) |
■Object の書き込みメソッド
配列や Object を、直列化して書き込みます。シリアライズと呼ばれる機能です。
メソッド名 | 型 | 説明 |
writeObject | Object | オブジェクトとして書き込む(AMF 直列化形式) |
■ByteArray の書き込みメソッド
ByteArray 型として書き込みます。
メソッド名 | 型 | 説明 |
writeBytes | ByteArray | ByteArray型で書き込む |
■writeBoolean() メソッド
Boolean 型として、1バイト分書き込みます。
引数に true を指定した場合、1
引数に false を指定した場合、0 が出力されます。
Boolean型として1バイト分書き込む (注意:ファイル操作を行います!! )
import flash.filesystem.File;
import flash.filesystem.FileStream;
import flash.filesystem.FileMode;
// 一時的な作業用ファイルを作成
var file : File = File.createTempFile();
// ファイルストリームオブジェクトを作成する
var stream : FileStream = new FileStream();
// ------------------------------------------------------------
// 書き込みテスト
// ------------------------------------------------------------
// 書き込みモードで開く
stream.open(file , FileMode.WRITE);
stream.writeBoolean(false); // Boolean型として書き込む
stream.writeBoolean(true ); // Boolean型として書き込む
// ファイルストリームを閉じる
stream.close ();
// ------------------------------------------------------------
// 読み込みテスト
// ------------------------------------------------------------
// 読み込みモードで開く
stream.open(file , FileMode.READ);
// アクセス開始位置を 0 へ
stream.position = 0;
var value0 : Boolean = stream.readBoolean(); // Boolean型として読み込む
var value1 : Boolean = stream.readBoolean(); // Boolean型として読み込む
// ファイルストリームを閉じる
stream.close ();
// ------------------------------------------------------------
// トレーステスト
// ------------------------------------------------------------
trace(value0);
trace(value1);
// 一時的な作業用ファイルを削除
file.deleteFile ();
■writeByte() メソッド
8bit整数として、1バイト分書き込みます。
引数に数値を指定します。(-128 ~ 255)
8bit整数として書き込む (注意:ファイル操作を行います!! )
import flash.filesystem.File;
import flash.filesystem.FileStream;
import flash.filesystem.FileMode;
// 一時的な作業用ファイルを作成
var file : File = File.createTempFile();
// ファイルストリームオブジェクトを作成する
var stream : FileStream = new FileStream();
// ------------------------------------------------------------
// 書き込みテスト
// ------------------------------------------------------------
// 書き込みモードで開く
stream.open(file , FileMode.WRITE);
stream.writeByte(-32); // 8bit整数として書き込む
stream.writeByte( 45); // 8bit整数として書き込む
// ファイルストリームを閉じる
stream.close ();
// ------------------------------------------------------------
// 読み込みテスト
// ------------------------------------------------------------
// 読み込みモードで開く
stream.open(file , FileMode.READ);
// アクセス開始位置を 0 へ
stream.position = 0;
var value0 : int = stream.readByte(); // 8bit整数(符号あり)として読み込む
var value1 : int = stream.readByte(); // 8bit整数(符号あり)として読み込む
// ファイルストリームを閉じる
stream.close ();
// ------------------------------------------------------------
// トレーステスト
// ------------------------------------------------------------
trace(value0);
trace(value1);
// 一時的な作業用ファイルを削除
file.deleteFile ();
■writeShort() メソッド
16bit整数として、2バイト分書き込みます。
引数に数値を指定します。(-32768 ~ 65535)
16bit整数として書き込む (注意:ファイル操作を行います!! )
import flash.filesystem.File;
import flash.filesystem.FileStream;
import flash.filesystem.FileMode;
// 一時的な作業用ファイルを作成
var file : File = File.createTempFile();
// ファイルストリームオブジェクトを作成する
var stream : FileStream = new FileStream();
// ------------------------------------------------------------
// 書き込みテスト
// ------------------------------------------------------------
// 書き込みモードで開く
stream.open(file , FileMode.WRITE);
stream.writeShort(-3200); // 16bit整数として書き込む
stream.writeShort( 1234); // 16bit整数として書き込む
// ファイルストリームを閉じる
stream.close ();
// ------------------------------------------------------------
// 読み込みテスト
// ------------------------------------------------------------
// 読み込みモードで開く
stream.open(file , FileMode.READ);
// アクセス開始位置を 0 へ
stream.position = 0;
var value0 : int = stream.readShort(); // 16bit整数(符号あり)として読み込む
var value1 : int = stream.readShort(); // 16bit整数(符号あり)として読み込む
// ファイルストリームを閉じる
stream.close ();
// ------------------------------------------------------------
// トレーステスト
// ------------------------------------------------------------
trace(value0);
trace(value1);
// 一時的な作業用ファイルを削除
file.deleteFile ();
■writeUnsignedInt() メソッド
32bit整数(符号なし)として、4バイト分書き込みます。
引数に数値を指定します。(0 ~ 4294967295)
32bit整数(符号なし)として書き込む (注意:ファイル操作を行います!! )
import flash.filesystem.File;
import flash.filesystem.FileStream;
import flash.filesystem.FileMode;
// 一時的な作業用ファイルを作成
var file : File = File.createTempFile();
// ファイルストリームオブジェクトを作成する
var stream : FileStream = new FileStream();
// ------------------------------------------------------------
// 書き込みテスト
// ------------------------------------------------------------
// 書き込みモードで開く
stream.open(file , FileMode.WRITE);
stream.writeUnsignedInt(32000000); // 32bit整数(符号なし)として書き込む
stream.writeUnsignedInt(12345678); // 32bit整数(符号なし)として書き込む
// ファイルストリームを閉じる
stream.close ();
// ------------------------------------------------------------
// 読み込みテスト
// ------------------------------------------------------------
// 読み込みモードで開く
stream.open(file , FileMode.READ);
// アクセス開始位置を 0 へ
stream.position = 0;
var value0 : uint = stream.readUnsignedInt(); // 32bit整数(符号なし)として読み込む
var value1 : uint = stream.readUnsignedInt(); // 32bit整数(符号なし)として読み込む
// ファイルストリームを閉じる
stream.close ();
// ------------------------------------------------------------
// トレーステスト
// ------------------------------------------------------------
trace(value0);
trace(value1);
// 一時的な作業用ファイルを削除
file.deleteFile ();
■writeInt() メソッド
32bit整数(符号あり)として4バイト分書き込みます。
引数に数値を指定します。(-2147483648 ~ 2147483647)
32bit整数(符号あり)として書き込む (注意:ファイル操作を行います!! )
import flash.filesystem.File;
import flash.filesystem.FileStream;
import flash.filesystem.FileMode;
// 一時的な作業用ファイルを作成
var file : File = File.createTempFile();
// ファイルストリームオブジェクトを作成する
var stream : FileStream = new FileStream();
// ------------------------------------------------------------
// 書き込みテスト
// ------------------------------------------------------------
// 書き込みモードで開く
stream.open(file , FileMode.WRITE);
stream.writeInt(-32000000); // 32bit整数(符号あり)として書き込む
stream.writeInt( 12345678); // 32bit整数(符号あり)として書き込む
// ファイルストリームを閉じる
stream.close ();
// ------------------------------------------------------------
// 読み込みテスト
// ------------------------------------------------------------
// 読み込みモードで開く
stream.open(file , FileMode.READ);
// アクセス開始位置を 0 へ
stream.position = 0;
var value0 : int = stream.readInt(); // 32bit整数(符号あり)として読み込む
var value1 : int = stream.readInt(); // 32bit整数(符号あり)として読み込む
// ファイルストリームを閉じる
stream.close ();
// ------------------------------------------------------------
// トレーステスト
// ------------------------------------------------------------
trace(value0);
trace(value1);
// 一時的な作業用ファイルを削除
file.deleteFile ();
■writeFloat() メソッド
32bit浮動小数点数として、4バイト分書き込みます。
引数に数値を指定します。
32bit浮動小数点数として書き込む (注意:ファイル操作を行います!! )
import flash.filesystem.File;
import flash.filesystem.FileStream;
import flash.filesystem.FileMode;
// 一時的な作業用ファイルを作成
var file : File = File.createTempFile();
// ファイルストリームオブジェクトを作成する
var stream : FileStream = new FileStream();
// ------------------------------------------------------------
// 書き込みテスト
// ------------------------------------------------------------
// 書き込みモードで開く
stream.open(file , FileMode.WRITE);
stream.writeFloat(0.123); // 32bit浮動小数点数として書き込む
stream.writeFloat(123.4); // 32bit浮動小数点数として書き込む
// ファイルストリームを閉じる
stream.close ();
// ------------------------------------------------------------
// 読み込みテスト
// ------------------------------------------------------------
// 読み込みモードで開く
stream.open(file , FileMode.READ);
// アクセス開始位置を 0 へ
stream.position = 0;
var value0 : Number = stream.readFloat(); // 32bit浮動小数点数として読み込む
var value1 : Number = stream.readFloat(); // 32bit浮動小数点数として読み込む
// ファイルストリームを閉じる
stream.close ();
// ------------------------------------------------------------
// トレーステスト
// ------------------------------------------------------------
trace(value0);
trace(value1);
// 一時的な作業用ファイルを削除
file.deleteFile ();
■writeDouble() メソッド
64bit浮動小数点数として、8バイト分書き込みます。
引数に数値を指定します。
64bit浮動小数点数として書き込む (注意:ファイル操作を行います!! )
import flash.filesystem.File;
import flash.filesystem.FileStream;
import flash.filesystem.FileMode;
// 一時的な作業用ファイルを作成
var file : File = File.createTempFile();
// ファイルストリームオブジェクトを作成する
var stream : FileStream = new FileStream();
// ------------------------------------------------------------
// 書き込みテスト
// ------------------------------------------------------------
// 書き込みモードで開く
stream.open(file , FileMode.WRITE);
stream.writeDouble(0.123456789); // 64bit浮動小数点数として書き込む
stream.writeDouble(123.4567890); // 64bit浮動小数点数として書き込む
// ファイルストリームを閉じる
stream.close ();
// ------------------------------------------------------------
// 読み込みテスト
// ------------------------------------------------------------
// 読み込みモードで開く
stream.open(file , FileMode.READ);
// アクセス開始位置を 0 へ
stream.position = 0;
var value0 : Number = stream.readDouble(); // 64bit浮動小数点数として読み込む
var value1 : Number = stream.readDouble(); // 64bit浮動小数点数として読み込む
// ファイルストリームを閉じる
stream.close ();
// ------------------------------------------------------------
// トレーステスト
// ------------------------------------------------------------
trace(value0);
trace(value1);
// 一時的な作業用ファイルを削除
file.deleteFile ();
■writeUTF() メソッド
「UTF 文字列」と、「総バイト数」の情報を書き込みます。
AIR アプリ間で、 UTF-8 文字列をやり取りしたい場合は、こちらがお勧めです。
UTF-8 文字列が、65535 バイトより多い場合、エラーとなります。
書き込み開始位置から、2バイト使用して「バイト数(16bit整数符号無し)」が書き込まれます。
さらにそこから「バイト数」分だけ「UTF-8 文字データ」が書き込まれます。
ファイルから読み込んで復元するには、readUTF() メソッドを使用します。
UTF文字列として書き込む (注意:ファイル操作を行います!! )
import flash.filesystem.File;
import flash.filesystem.FileStream;
import flash.filesystem.FileMode;
// 一時的な作業用ファイルを作成
var file : File = File.createTempFile();
// ファイルストリームオブジェクトを作成する
var stream : FileStream = new FileStream();
// ------------------------------------------------------------
// 書き込みテスト
// ------------------------------------------------------------
// 書き込みモードで開く
stream.open(file , FileMode.WRITE);
stream.writeUTF("abcあいう"); // UTF文字列として書き込む
// ファイルストリームを閉じる
stream.close ();
// ------------------------------------------------------------
// 読み込みテスト
// ------------------------------------------------------------
// 読み込みモードで開く
stream.open(file , FileMode.READ);
// アクセス開始位置を 0 へ
stream.position = 0;
var value : String = stream.readUTF(); // UTF文字列として読み込む
// ファイルストリームを閉じる
stream.close ();
// ------------------------------------------------------------
// トレーステスト
// ------------------------------------------------------------
trace(value);
// 一時的な作業用ファイルを削除
file.deleteFile ();
■writeUTFBytes() メソッド
UTF-8 文字列として書き込みます。
引数に、文字列を指定します。
ファイルから UTF-8 文字列を読み込む場合、「UTF-8 文字列の総バイト数」の情報がないと取り出せません。
「UTF-8 文字列の総バイト数」の情報も同時に書き込まれる、writeUTF() メソッドを利用する方法もあります。
UTF文字列として書き込む (注意:ファイル操作を行います!! )
import flash.filesystem.File;
import flash.filesystem.FileStream;
import flash.filesystem.FileMode;
// 一時的な作業用ファイルを作成
var file : File = File.createTempFile();
// ファイルストリームオブジェクトを作成する
var stream : FileStream = new FileStream();
// ------------------------------------------------------------
// 書き込みテスト
// ------------------------------------------------------------
// 書き込みモードで開く
stream.open(file , FileMode.WRITE);
stream.writeUTFBytes("abcあいう"); // UTF文字列として書き込む
// ファイルストリームを閉じる
stream.close ();
// ------------------------------------------------------------
// 読み込みテスト
// ------------------------------------------------------------
// 読み込みモードで開く
stream.open(file , FileMode.READ);
// アクセス開始位置を 0 へ
stream.position = 0;
var value : String = stream.readUTFBytes(file.size); // UTF文字列として読み込む
// ファイルストリームを閉じる
stream.close ();
// ------------------------------------------------------------
// トレーステスト
// ------------------------------------------------------------
trace(value);
// 一時的な作業用ファイルを削除
file.deleteFile ();
■writeMultiByte() メソッド
コードを指定して、文字列を書き込みます。
第01引数に、書き込みたい文字列を指定します。
第02引数に、書き込みたいコードを文字列で指定します。コード一覧は、以下の通りです。
コード | 文字列 |
日本語(EUC) | "euc-jp" |
日本語(JIS) | "iso-2022-jp" |
日本語(Shift-JIS) | "shift_jis" |
Unicode (UTF-16) | "unicode" |
その他の、文字コード一覧は、公式リファレンスが参考になります。
http://help.adobe.com/ja_JP/FlashPlatform/reference/actionscript/3/charset-codes.html
Shift-JIS文字列として書き込む (注意:ファイル操作を行います!! )
import flash.filesystem.File;
import flash.filesystem.FileStream;
import flash.filesystem.FileMode;
// 一時的な作業用ファイルを作成
var file : File = File.createTempFile();
// ファイルストリームオブジェクトを作成する
var stream : FileStream = new FileStream();
// ------------------------------------------------------------
// 書き込みテスト
// ------------------------------------------------------------
// 書き込みモードで開く
stream.open(file , FileMode.WRITE);
stream.writeMultiByte("abcあいう","shift_jis"); // Shift-JIS文字列として読み込む
// ファイルストリームを閉じる
stream.close ();
// ------------------------------------------------------------
// 読み込みテスト
// ------------------------------------------------------------
// 読み込みモードで開く
stream.open(file , FileMode.READ);
// アクセス開始位置を 0 へ
stream.position = 0;
var value : String = stream.readMultiByte(file.size,"shift_jis"); // Shift-JIS文字列として読み込む
// ファイルストリームを閉じる
stream.close ();
// ------------------------------------------------------------
// トレーステスト
// ------------------------------------------------------------
trace(value);
// 一時的な作業用ファイルを削除
file.deleteFile ();
■writeObject() メソッド
配列やオブジェクトを、直列化して書き込みます。
シリアライズと呼ばれる機能です。
ファイルから読み込んで復元するには、readObject() メソッドを使用します。
Object型として書き込む (注意:ファイル操作を行います!! )
import flash.filesystem.File;
import flash.filesystem.FileStream;
import flash.filesystem.FileMode;
// 一時的な作業用ファイルを作成
var file : File = File.createTempFile();
// ファイルストリームオブジェクトを作成する
var stream : FileStream = new FileStream();
// ------------------------------------------------------------
// 書き込みテスト
// ------------------------------------------------------------
// 書き込みモードで開く
stream.open(file , FileMode.WRITE);
var obj : Object = {
a : 0,
b : 1,
c : [2,3,4,5]
};
// Object 型を直列化して書き込む
stream.writeObject(obj);
// ファイルストリームを閉じる
stream.close ();
// ------------------------------------------------------------
// 読み込みテスト
// ------------------------------------------------------------
// 読み込みモードで開く
stream.open(file , FileMode.READ);
// アクセス開始位置を 0 へ
stream.position = 0;
var value : Object = stream.readObject(); // Object 型として読み込む
// ファイルストリームを閉じる
stream.close ();
// ------------------------------------------------------------
// トレーステスト
// ------------------------------------------------------------
trace(value.a);
trace(value.b);
trace(value.c);
// 一時的な作業用ファイルを削除
file.deleteFile ();
■writeBytes() メソッド
ByteArray オブジェクトから読み込んで、ファイルに書き込みます。
第01引数に、読み込みたい ByteArray オブジェクトを指定します。
第02引数に、読み込みたい ByteArray オブジェクトの、読み込み開始位置を指定します。
第03引数に、ファイルへ書き込むサイズ(ByteArray オブジェクトから読み込むサイズ)を指定します。
ファイルの書き込み開始位置は、position プロパティで設定します。
メソッド実行後、ByteArray オブジェクトの位置は変化しません。
ByteArray オブジェクトから読み込んで、ファイルに書き込む (注意:ファイル操作を行います!! )
import flash.filesystem.File;
import flash.filesystem.FileStream;
import flash.filesystem.FileMode;
import flash.utils.ByteArray;
// 一時的な作業用ファイルを作成
var file : File = File.createTempFile();
// ファイルストリームオブジェクトを作成する
var stream_out : FileStream = new FileStream();
// ------------------------------------------------------------
// 読み込みたい ByteArray オブジェクトを用意
// ------------------------------------------------------------
// ByteArray オブジェクトを作成する
var stream_src:ByteArray = new ByteArray();
stream_src.writeByte(0x00); // 8bit整数として書き込む
stream_src.writeByte(0x01); // 8bit整数として書き込む
stream_src.writeByte(0x02); // 8bit整数として書き込む
stream_src.writeByte(0x03); // 8bit整数として書き込む
stream_src.writeByte(0x04); // 8bit整数として書き込む
// ------------------------------------------------------------
// 書き込みテスト
// ------------------------------------------------------------
// 書き込みモードで開く
stream_out.open(file , FileMode.WRITE);
// アクセス開始位置を 0 へ
stream_out.position = 0;
// ByteArray オブジェクトから、総サイズ分読み込んで、ファイルに書き込む
stream_out.writeBytes(stream_src , 0 , stream_src.length);
// ファイルストリームを閉じる
stream_out.close ();
// ------------------------------------------------------------
// トレーステスト
// ------------------------------------------------------------
// 読み込みモードで開く
stream_out.open(file , FileMode.READ);
var i:Number;
var num:Number = file.size;
for(i=0;i < num;i++){
trace(stream_out.readUnsignedByte());
}
// ファイルストリームを閉じる
stream_out.close ();
// 一時的な作業用ファイルを削除
file.deleteFile ();
エンディアンを変更する
■エンディアンとは?
エンディアンとは、メモリの配置の方式です。
ビッグエンディアンとリトルエンディアンの2通りの方式があります。
Adobe AIR のデフォルトは、ビッグエンディアンです。
メジャーなファイルフォーマットのバイナリデータを利用したい場合、エンディアン方式を使い分ける必要があります。
例えば、「Windows Bitmap (*.bmp) 形式」は、リトルエンディアンです。
例えば、「Portable Network Graphics (*.png) 形式」は、ビッグエンディアンです。
■ビッグエンディアン
ビッグエンディアン形式に変更するには、endian プロパティに Endian.BIG_ENDIAN をセットします。
ビッグエンディアン形式は、上位バイトからデータが格納されます。
ファイルのバイトの並び順通りに、変数上に格納されるので、視覚的にわかりやすくなります。
ビッグエンディアン形式で読み込む (注意:ファイル操作を行います!! )
import flash.filesystem.File;
import flash.filesystem.FileStream;
import flash.filesystem.FileMode;
import flash.utils.Endian;
// 一時的な作業用ファイルを作成
var file : File = File.createTempFile();
// ファイルストリームオブジェクトを作成する
var stream : FileStream = new FileStream();
// ビッグエンディアン形式に変更する
stream.endian = Endian.BIG_ENDIAN;
// ------------------------------------------------------------
// 書き込みテスト
// ------------------------------------------------------------
// 書き込みモードで開く
stream.open(file , FileMode.WRITE);
stream.writeByte(0x12); // 8bit整数として書き込む
stream.writeByte(0x34); // 8bit整数として書き込む
stream.writeByte(0x56); // 8bit整数として書き込む
stream.writeByte(0x78); // 8bit整数として書き込む
// ファイルストリームを閉じる
stream.close ();
// ------------------------------------------------------------
// 読み込みテスト
// ------------------------------------------------------------
// 読み込みモードで開く
stream.open(file , FileMode.READ);
// 8bit整数(符号なし)として読み込む( 1 バイト分読み込む)
stream.position = 0;
var value0 : uint = stream.readUnsignedByte();
// 16bit整数(符号なし)として読み込む( 2 バイト分読み込む)
stream.position = 0;
var value1 : uint = stream.readUnsignedShort();
// 32bit整数(符号なし)として読み込む( 4 バイト分読み込む)
stream.position = 0;
var value2 : uint = stream.readUnsignedInt();
// ファイルストリームを閉じる
stream.close ();
// ------------------------------------------------------------
// トレーステスト
// ------------------------------------------------------------
trace(value0.toString(16)); // 16進数で表示 0x12
trace(value1.toString(16)); // 16進数で表示 0x1234
trace(value2.toString(16)); // 16進数で表示 0x12345678
// 一時的な作業用ファイルを削除
file.deleteFile ();
■リトルエンディアン
リトルエンディアン形式に変更するには、endian プロパティに Endian.LITTLE_ENDIAN を代入します。
リトルエンディアン形式は、下位バイトからデータが格納されます。
ファイルのバイトの並びと、実際に変数上に格納される順番が、反転します。
下位バイトからデータが格納される事になるので、どんなサイズで変数に格納しても下位は揃います。
上位の桁の切捨てが容易になります。
リトルエンディアン形式で読み込む (注意:ファイル操作を行います!! )
import flash.filesystem.File;
import flash.filesystem.FileStream;
import flash.filesystem.FileMode;
import flash.utils.Endian;
// 一時的な作業用ファイルを作成
var file : File = File.createTempFile();
// ファイルストリームオブジェクトを作成する
var stream : FileStream = new FileStream();
// リトルエンディアンに変更する
stream.endian = Endian.LITTLE_ENDIAN;
// ------------------------------------------------------------
// 書き込みテスト
// ------------------------------------------------------------
// 書き込みモードで開く
stream.open(file , FileMode.WRITE);
stream.writeByte(0x12); // 8bit整数として書き込む
stream.writeByte(0x34); // 8bit整数として書き込む
stream.writeByte(0x56); // 8bit整数として書き込む
stream.writeByte(0x78); // 8bit整数として書き込む
// ファイルストリームを閉じる
stream.close ();
// ------------------------------------------------------------
// 読み込みテスト
// ------------------------------------------------------------
// 読み込みモードで開く
stream.open(file , FileMode.READ);
// 8bit整数(符号なし)として読み込む( 1 バイト分読み込む)
stream.position = 0;
var value0 : uint = stream.readUnsignedByte();
// 16bit整数(符号なし)として読み込む( 2 バイト分読み込む)
stream.position = 0;
var value1 : uint = stream.readUnsignedShort();
// 32bit整数(符号なし)として読み込む( 4 バイト分読み込む)
stream.position = 0;
var value2 : uint = stream.readUnsignedInt();
// ファイルストリームを閉じる
stream.close ();
// ------------------------------------------------------------
// トレーステスト
// ------------------------------------------------------------
trace(value0.toString(16)); // 16進数で表示 0x12
trace(value1.toString(16)); // 16進数で表示 0x3412
trace(value2.toString(16)); // 16進数で表示 0x78563412
// 一時的な作業用ファイルを削除
file.deleteFile ();
■ C言語でのエンディアン
CPU ごとに、エンディアン方式が決まっています。
例えば、インテルの x86系 CPU は、リトルエンディアン方式です。
例えば、モトローラの 68000系 CPU は、ビッグエンディアン方式です。
C言語で、「バイトストリーム」からポインタで値を取得すると、CPU のエンディアン方式通りに、変数に格納されます。
C言語で、「CPUのエンディアン」と「バイトストリームのエンディアン」が一致する場合、ポインタから直接アクセスするだけで、そのまま利用できます。
一致しない場合、「バイトの並び順を入れ替える」という処理が、別途必要になります。
特定のCPU環境で、最適に動作する自作のバイナリファイルを用意したい場合、エンディアン方式を一致させると効率がよくなります。
ただし、ポインタから直接アクセスするプログラムは、エンディアンの違うCPU環境では動作しなくなります。
移植の予定がある場合は注意します。