轉(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();
工作流程
- 創(chuàng)建File對象指向文件路徑
- 初始化FileStream對象
- 使用FileStream的open()或openAsync()方法
- 若使用的是異步的openAsync()方法則需要為FileStream設(shè)置事件監(jiān)聽
- 加入所需的讀寫數(shù)據(jù)代碼
- 完成文件操作后執(zhí)行FileStream的close()方法
使用FileStream要了解的知識
-
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é)不受影響。 |
- 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
- 根據(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