[轉(zhuǎn)] ActionScript 讀寫文件

轉(zhuǎn):http://www.flashj.cn/wp/air-file-operation3.html 博主:鼠標(biāo)炸彈技術(shù)博客

快速上手例:
例1.讀xml

var testXML:XML;
var file:File = File.documentsDirectory.resolvePath("Mousebomb/test.xml");
var fileStream:FileStream = new FileStream();
fileStream.open(file, FileMode.READ);
testXML = XML(fileStream.readUTFBytes(fileStream.bytesAvailable));
fileStream.close();

例中使用readUTFBytes()方法讀取內(nèi)容并轉(zhuǎn)換為XML對象宋税。
例2.寫xml

var testXML:XML =<mousebomb><site>www.mousebomb.org</site><blog>www.flashj.cn</blog></mousebomb>;
var file:File = File.documentsDirectory.resolvePath("Mousebomb/test.xml");
var fileStream:FileStream = new FileStream();
fileStream.open(file, FileMode.WRITE);
var outputString:String = '<?xml version="1.0" encoding="utf-8"?>';
outputString += testXML.toXMLString();
fileStream.writeUTFBytes(outputString);
fileStream.close();

工作流程

  1. 創(chuàng)建File對象指向文件路徑
  2. 初始化FileStream對象
  3. 使用FileStream的open()或openAsync()方法
  4. 若使用的是異步的openAsync()方法則需要為FileStream設(shè)置事件監(jiān)聽
  5. 加入所需的讀寫數(shù)據(jù)代碼
  6. 完成文件操作后執(zhí)行FileStream的close()方法

使用FileStream要了解的知識

  1. FileModeFileStream的open()和openAsync()方法都包含一個fileMode參數(shù),該參數(shù)用于設(shè)置:
    讀取文件能力
    寫入文件能力
    是否總在文件末尾追加數(shù)據(jù)(寫數(shù)據(jù)時)
    文件不存在時如何操作(或文件的父級不存在時)

具體值包括

FileMode值 描述
FileMode.READ 設(shè)置文件打開方式為只讀
FileMode.WRITE 設(shè)置文件打開方式為寫數(shù)據(jù)嬉荆。若文件不存在掘而,則創(chuàng)建之鸿脓;若文件存在犹菇,則該文件所有存在數(shù)據(jù)被刪除。
FileMode.APPEND 設(shè)置文件打開方式為追加闹蒜。若文件不存在寺枉,則創(chuàng)建之;若存在绷落,則文件所有存在數(shù)據(jù)不被覆蓋姥闪,所有寫入的數(shù)據(jù)從文件末尾開始。
FileMode.UPDATE 設(shè)置文件打開方式為讀寫砌烁。若文件不存在筐喳,則創(chuàng)建之。設(shè)置該模式通常用于隨機(jī)讀寫訪問文件函喉”芄椋可以從文件的任意位置讀取,寫入數(shù)據(jù)時管呵,只有寫入位置的存在字節(jié)被覆蓋梳毙,其他所有字節(jié)不受影響。
  1. position該屬性決定下一個數(shù)據(jù)讀寫操作進(jìn)行的位置捐下。在讀寫操作前账锹,設(shè)置position屬性為文件中的有效位置,比如:
var myFile:File = File.documentsDirectory.resolvePath("Mousebomb/site.txt");
var myFileStream:FileStream = new FileStream();
myFileStream.open(myFile, FileMode.UPDATE);
myFileStream.position = 8;
myFileStream.writeUTFBytes("hello");

該例在位置8處寫入UTF編碼的字符串“hello”
新打開的FileStream對象的position值為0坷襟,在讀文件操作前奸柬,position的值必最小為0并小于文件總字節(jié)數(shù)。position的值僅會在以下情況下改變:
直接設(shè)置該屬性值
執(zhí)行讀取操作
執(zhí)行寫入操作

當(dāng)執(zhí)行讀/寫操作時婴程,position的值會立即自增讀/寫的字節(jié)數(shù)廓奕,再次執(zhí)行讀/寫操作時會從新的position位置開始:

var myFile:File = File.documentsDirectory.resolvePath("Mousebomb/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

position有一個例外:若文件打開模式設(shè)置為append(追加模式),則position屬性不會隨著寫操作變化排抬。在追加模式下懂从,數(shù)據(jù)總是往文件末尾寫,與position無關(guān)蹲蒲。
異步方式打開文件番甩,寫數(shù)據(jù)操作在下一行代碼執(zhí)行時并沒有結(jié)束。這怎么辦呢届搁?沒關(guān)系缘薛,你可以按順序的調(diào)用多個異步操作窍育,AIR運(yùn)行環(huán)境會逐個執(zhí)行:

var myFile:File = File.documentsDirectory.resolvePath("Mousebomb/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.
你可以在異步讀寫操作調(diào)用后,立即設(shè)置position的值宴胧,下次讀寫操作將換作從那個位置開始漱抓。比如:

var myFile:File = File.documentsDirectory.resolvePath("Mousebomb/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
  1. 根據(jù)數(shù)據(jù)格式,選擇合適的讀寫操作硬盤上的每個文件都是字節(jié)集合恕齐。在AS中乞娄,文件中的數(shù)據(jù)總是可以描述為ByteArray.比如下面的代碼把文件數(shù)據(jù)讀取到bytes這個ByteArray中:
var myFile:File = File.documentsDirectory.resolvePath("Mousebomb/test.txt");
var myFileStream:FileStream = new FileStream();
myFileStream.addEventListener(Event.COMPLETE, completed);
myFileStream.openAsync(myFile, FileMode.READ);
var bytes:ByteArray = new ByteArray();
function completeHandler(event:Event):void
{
myFileStream.readBytes(bytes, 0, myFileStream.bytesAvailable);
}

下面的代碼把數(shù)據(jù)從bytes這個ByteArray中寫入文件:

var myFile:File = File.documentsDirectory.resolvePath("Mousebomb/test.txt");
var myFileStream:FileStream = new FileStream();
myFileStream.open(myFile, FileMode.WRITE);
myFileStream.writeBytes(bytes, 0, bytes.length);

往往我們并不希望把數(shù)據(jù)作ByteArray處理,有時候要處理的文件是特定格式显歧,比如文件中的數(shù)據(jù)是字符串仪或。因此FileStream類也包含ByteArray以外的數(shù)據(jù)格式讀寫方法,比如readMultiByte()方法士骤,可將文件讀取暫存為字符串范删,如下代碼:

var myFile:File = File.documentsDirectory.resolvePath("Mousebomb/test.txt");
var myFileStream:FileStream = new FileStream();
myFileStream.addEventListener(Event.COMPLETE, completed);
myFileStream.openAsync(myFile, FileMode.READ);
var str:String = "";
function completeHandler(event:Event):void
{
   str = myFileStream.readMultiByte(myFileStream.bytesAvailable, "iso-8859-1");
}

readMultiByte()的第二個參數(shù)(本例中為“iso-8859-1”)指定了ActionScript用來解釋的文本格式。ActionScript支持通用字符集編碼拷肌,具體羅列在http://livedocs.macromedia.com/flex/2/langref/charset-codes.html

FileStream 類還具有readUTFBytes()方法到旦,從讀緩存中以UTF-8字符集讀取數(shù)據(jù)。由于UTF8字符集為可變長巨缘,讀緩存末尾數(shù)據(jù)并不一定是完整字符添忘,所以不要在處理progress 事件的方法中使用readUTFBytes()方法(用readMultiByte()讀取可變長字符編碼也應(yīng)遵循此項),而應(yīng)在FileStream的complete事件發(fā)生時讀取完整數(shù)據(jù)集若锁。

同樣昔汉,有類似的寫操作writeMultiByte()和writeUTFBytes(),用來處理字符串對象和文本文件拴清。
readUTF()和writeUTF()方法同樣是讀寫文本數(shù)據(jù),不過它們假定文本數(shù)據(jù)在指定文本數(shù)據(jù)長度之前会通,該文本數(shù)據(jù)是不在標(biāo)準(zhǔn)文本文件里普遍應(yīng)用的口予。有些UTF編碼文本文件以一個UTF-BOM(Byte Order Mark)字符開頭,像編碼格式(如UTF16和UTF32)一樣涕侈,也聲明字節(jié)序沪停。

readObject() 和writeObject()方法便于為復(fù)雜AS對象存取數(shù)據(jù),數(shù)據(jù)作AMF(ActionScript Message Format)編碼裳涛,此格式為ActionScript私有木张,AIR、Flash Player端三、Flash Media Server舷礼、Flex Data Services以外的程序都沒有操作該格式的內(nèi)建API。此外還有一些讀寫操作郊闯,像readDouble()和writeDouble()之類的妻献,使用它們需確保所操作文件格式與之對應(yīng)蛛株。

一般的文件結(jié)構(gòu)往往比文本文件要復(fù)雜的多。比如mp3文件包含只能被mp3解壓解碼算法解釋的壓縮數(shù)據(jù)格式育拨。其他文件谨履,像圖片、數(shù)據(jù)庫熬丧、應(yīng)用程序檔案等等都有不同的結(jié)構(gòu)笋粟,要想用AS操作它們的數(shù)據(jù),得對其結(jié)構(gòu)十分了解析蝴。

至此害捕,學(xué)習(xí)筆記《AIR文件操作》結(jié)束。所有知識點(diǎn)來自:官方文檔嫌变。(本文若有不當(dāng)之處,敬請指出吨艇。)參考文獻(xiàn):http://livedocs.adobe.com/air/1/devappsflash/help.html?content=dg_part_6_1.htmlhttp://livedocs.macromedia.com/flex/2/langref/charset-codes.htmlhttp://www.adobe.com/go/learn_air_aslr

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市腾啥,隨后出現(xiàn)的幾起案子东涡,更是在濱河造成了極大的恐慌,老刑警劉巖倘待,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件疮跑,死亡現(xiàn)場離奇詭異,居然都是意外死亡凸舵,警方通過查閱死者的電腦和手機(jī)祖娘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來啊奄,“玉大人渐苏,你說我怎么就攤上這事」娇洌” “怎么了琼富?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長庄新。 經(jīng)常有香客問我鞠眉,道長,這世上最難降的妖魔是什么择诈? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任械蹋,我火速辦了婚禮,結(jié)果婚禮上羞芍,老公的妹妹穿的比我還像新娘哗戈。我一直安慰自己,他們只是感情好涩金,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布谱醇。 她就那樣靜靜地躺著暇仲,像睡著了一般。 火紅的嫁衣襯著肌膚如雪副渴。 梳的紋絲不亂的頭發(fā)上奈附,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天,我揣著相機(jī)與錄音煮剧,去河邊找鬼斥滤。 笑死,一個胖子當(dāng)著我的面吹牛勉盅,可吹牛的內(nèi)容都是我干的佑颇。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼草娜,長吁一口氣:“原來是場噩夢啊……” “哼挑胸!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起宰闰,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤茬贵,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后移袍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體解藻,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年葡盗,在試婚紗的時候發(fā)現(xiàn)自己被綠了螟左。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡觅够,死狀恐怖胶背,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情喘先,我是刑警寧澤奄妨,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站苹祟,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏评雌。R本人自食惡果不足惜树枫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望景东。 院中可真熱鬧砂轻,春花似錦、人聲如沸斤吐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至庄呈,卻和暖如春蜕煌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背诬留。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工斜纪, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人文兑。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓盒刚,卻偏偏與公主長得像,于是被迫代替她去往敵國和親绿贞。 傳聞我的和親對象是個殘疾皇子因块,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內(nèi)容