1. 程式人生 > >Flash AIR檔案操作:使用FileStream物件讀寫檔案

Flash AIR檔案操作:使用FileStream物件讀寫檔案

 

快速上手例:

例1.讀xml

  1. vartestXML:XML;
  2. varfile:File = File.documentsDirectory.resolvePath("Mousebomb/test.xml");
  3. varfileStream:FileStream = newFileStream();
  4. fileStream.open(file, FileMode.READ);
  5. testXML = XML(fileStream.readUTFBytes(fileStream.bytesAvailable));
  6. fileStream.close();

例中使用readUTFBytes()方法讀取內容並轉換為XML物件。

例2.寫xml

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

寫XML也一樣簡單,建立File物件和FileStream物件,使用writeUTFBytes()寫入資料。

工作流程

要完成讀寫檔案操作無非就是這幾步:
1. 建立File物件指向檔案路徑
2. 初始化FileStream物件
3. 使用FileStream的open()或openAsync()方法
4. 若使用的是非同步的openAsync()方法則需要為FileStream設定事件監聽
5. 加入所需的讀寫資料程式碼
6. 完成檔案操作後執行FileStream的close()方法

使用FileStream要了解的知識

1. FileMode
FileStream的open()和openAsync()方法都包含一個fileMode引數,該引數用於設定:

  • 讀取檔案能力
  • 寫入檔案能力
  • 是否總在檔案末尾追加資料(寫資料時)
  • 檔案不存在時如何操作(或檔案的父級不存在時)

具體值包括

FileMode值

描述

FileMode.READ

設定檔案開啟方式為只讀

FileMode.WRITE

設定檔案開啟方式為寫資料。若檔案不存在,則建立之;若檔案存在,則該檔案所有存在資料被刪除。

FileMode.APPEND

設定檔案開啟方式為追加。若檔案不存在,則建立之;若存在,則檔案所有存在資料不被覆蓋,所有寫入的資料從檔案末尾開始。

FileMode.UPDATE

設定檔案開啟方式為讀寫。若檔案不存在,則建立之。設定該模式通常用於隨機讀寫訪問檔案。可以從檔案的任意位置讀取,寫入資料時,只有寫入位置的存在位元組被覆蓋,其他所有位元組不受影響。

2. position
該屬性決定下一個資料讀寫操作進行的位置。
在讀寫操作前,設定position屬性為檔案中的有效位置,比如:

  1. varmyFile:File = File.documentsDirectory.resolvePath("Mousebomb/site.txt");
  2. varmyFileStream:FileStream = newFileStream();
  3. myFileStream.open(myFile, FileMode.UPDATE);
  4. myFileStream.position = 8;
  5. myFileStream.writeUTFBytes("hello");

該例在位置8處寫入UTF編碼的字串“hello”

新開啟的FileStream物件的position值為0,在讀檔案操作前,position的值必最小為0並小於檔案總位元組數。
position的值僅會在以下情況下改變:

  1. 直接設定該屬性值
  2. 執行讀取操作
  3. 執行寫入操作

當執行讀/寫操作時,position的值會立即自增讀/寫的位元組數,再次執行讀/寫操作時會從新的position位置開始:

  1. varmyFile:File = File.documentsDirectory.resolvePath("Mousebomb/test.txt");
  2. varmyFileStream:FileStream = newFileStream();
  3. myFileStream.open(myFile, FileMode.UPDATE);
  4. myFileStream.position = 4000;
  5. trace(myFileStream.position); // 4000
  6. myFileStream.writeBytes(myByteArray, 0, 200);
  7. trace(myFileStream.position); // 4200

position有一個例外:若檔案開啟模式設定為append(追加模式),則position屬性不會隨著寫操作變化。在追加模式下,資料總是往檔案末尾寫,與position無關。

非同步方式開啟檔案,寫資料操作在下一行程式碼執行時並沒有結束。這怎麼辦呢?沒關係,你可以按順序的呼叫多個非同步操作,AIR執行環境會逐個執行:

  1. varmyFile:File = File.documentsDirectory.resolvePath("Mousebomb/test.txt");
  2. varmyFileStream:FileStream = newFileStream();
  3. myFileStream.openAsync(myFile, FileMode.WRITE);
  4. myFileStream.writeUTFBytes("hello");
  5. myFileStream.writeUTFBytes("world");
  6. myFileStream.addEventListener(Event.CLOSE, closeHandler);
  7. myFileStream.close();
  8. trace("started.");
  9. closeHandler(event:Event):void
  10. {
  11. trace("finished.");
  12. }

該例會輸出:
started.
finished.

你可以在非同步讀寫操作呼叫後,立即設定position的值,下次讀寫操作將換作從那個位置開始。比如:

  1. varmyFile:File = File.documentsDirectory.resolvePath("Mousebomb/test.txt");
  2. varmyFileStream:FileStream = newFileStream();
  3. myFileStream.openAsync(myFile, FileMode.UPDATE);
  4. myFileStream.position = 4000;
  5. trace(myFileStream.position); // 4000
  6. myFileStream.writeBytes(myByteArray, 0, 200);
  7. myFileStream.position = 300;
  8. trace(myFileStream.position); // 300

3. 根據資料格式,選擇合適的讀寫操作
硬碟上的每個檔案都是位元組集合。在AS中,檔案中的資料總是可以描述為ByteArray.比如下面的程式碼把檔案資料讀取到bytes這個ByteArray中:

  1. varmyFile:File = File.documentsDirectory.resolvePath("Mousebomb/test.txt");
  2. varmyFileStream:FileStream = newFileStream();
  3. myFileStream.addEventListener(Event.COMPLETE, completed);
  4. myFileStream.openAsync(myFile, FileMode.READ);
  5. varbytes:ByteArray = newByteArray();
  6. functioncompleteHandler(event:Event):void
  7. {
  8. myFileStream.readBytes(bytes, 0, myFileStream.bytesAvailable);
  9. }

下面的程式碼把資料從bytes這個ByteArray中寫入檔案:

  1. varmyFile:File = File.documentsDirectory.resolvePath("Mousebomb/test.txt");
  2. varmyFileStream:FileStream = newFileStream();
  3. myFileStream.open(myFile, FileMode.WRITE);
  4. myFileStream.writeBytes(bytes, 0, bytes.length);

往往我們並不希望把資料作ByteArray處理,有時候要處理的檔案是特定格式,比如檔案中的資料是字串。因此FileStream類也包含ByteArray以外的資料格式讀寫方法,比如readMultiByte()方法,可將檔案讀取暫存為字串,如下程式碼:

  1. varmyFile:File = File.documentsDirectory.resolvePath("Mousebomb/test.txt");
  2. varmyFileStream:FileStream = newFileStream();
  3. myFileStream.addEventListener(Event.COMPLETE, completed);
  4. myFileStream.openAsync(myFile, FileMode.READ);
  5. varstr:String = "";
  6. functioncompleteHandler(event:Event):void
  7. {
  8. str = myFileStream.readMultiByte(myFileStream.bytesAvailable, "iso-8859-1");
  9. }

FileStream 類還具有readUTFBytes()方法,從讀快取中以UTF-8字符集讀取資料。由於UTF8字符集為可變長,讀快取末尾資料並不一定是完整字元,所以不要在處理progress 事件的方法中使用readUTFBytes()方法(用readMultiByte()讀取可變長字元編碼也應遵循此項),而應在FileStream的complete事件發生時讀取完整資料集。

同樣,有類似的寫操作writeMultiByte()和writeUTFBytes(),用來處理字串物件和文字檔案。

readUTF()和writeUTF()方法同樣是讀寫文字資料,不過它們假定文字資料在指定文字資料長度之前,該文字資料是不在標準文字檔案裡普遍應用的。
有些UTF編碼文字檔案以一個UTF-BOM(Byte Order Mark)字元開頭,像編碼格式(如UTF16和UTF32)一樣,也宣告位元組序。

readObject() 和writeObject()方法便於為複雜AS物件存取資料,資料作AMF(ActionScript. Message Format)編碼,此格式為ActionScript私有,AIR、Flash Player、Flash Media Server、Flex Data Services以外的程式都沒有操作該格式的內建API。
此外還有一些讀寫操作,像readDouble()和writeDouble()之類的,使用它們需確保所操作檔案格式與之對應。

一般的檔案結構往往比文字檔案要複雜的多。比如mp3檔案包含只能被mp3解壓解碼演算法解釋的壓縮資料格式。其他檔案,像圖片、資料庫、應用程式檔案等等都有不同的結構,要想用AS操作它們的資料,得對其結構十分了解。

至此,學習筆記《AIR檔案操作》結束。

相關推薦

Flash AIR檔案操作:使用FileStream物件檔案

  快速上手例: 例1.讀xml vartestXML:XML;varfile:File = File.documentsDirectory.resolvePath("Mousebomb/test.xml");varfileStream:FileStream = newF

幾分鐘搞懂c#之FileStream物件檔案

還是一樣,我先上程式碼,但是為了你們測試結果和我一樣,必須先有準備工作,否則會找不到目錄或者檔案就沒有效果; 既然是讀取大檔案,那麼這個文字必須存在 現在來看目標目錄 其實這裡的文字檔案可以刪除,因為我們寫入文字資料的時候的模式是當沒有找到檔案就建

Python 檔案操作中的模式:open(path, '-模式-',encoding='UTF-8')

open(path, ‘-模式-‘,encoding=’UTF-8’) 即open(路徑+檔名, 讀寫模式, 編碼) 在python對檔案進行讀寫操作的時候,常常涉及到“讀寫模式”,整理了一下常見的幾種模式,如下: 讀寫模式: r :只讀 r+ :

在Action中獲取檔案的路徑,檔案

ActionContext ac = ActionContext.getContext();  ServletContext sc = (ServletContext) ac.get(ServletA

FileStream操作

返回值 pos nco lin 字節數組 adk buffer spa txt 1.讀取     static void Main(string[] args) { /* * File類最大的問題是,一次性

android檔案操作——檔案demo

寫檔案操作: public void save(String inputText) { FileOutputStream out = null; BufferedWriter writer = null; try {

JAVA exception異常處理+I/O操作檔案 筆記

JAVA  異常處理  JAVA的異常5個關鍵字try...catch...finally..throw..throws 捕獲異常 宣告異常 丟擲異常 try 執行可能產生異常的程式碼 throws

node.js的fs核心模組檔案操作 -----由淺入深

https://www.cnblogs.com/null11/p/7499091.html node.js的fs核心模組讀寫檔案操作 -----由淺入深 node.js 裡fs模組 常用的功能 實現檔案的讀寫 目錄的操作 - 同步和非同步共存 ,有非同步不用同步 - fs.

C++檔案操作

原文來自:http://blog.csdn.net/study16/article/details/5879428 來源:http://www.javaeye.com/topic/383903 讀 《C++ Primer Plus》第17章4-7節 一     頭 

Python中的檔案IO操作檔案、追加檔案

【注】:下述操作過程是結合多種網路方法,然後自己實踐的結果。寫在這裡,主要目的是加深記憶,也希望能幫助後來者 Python中檔案的讀寫包含三個步驟:開啟檔案,讀/寫檔案,關閉檔案。 檔案開啟之後必

C++檔案操作函式-檔案

檔案讀寫是基礎中的基礎,關於此類知識的文章非常多,但還是想根據自己的使用心得去總結這麼一些內容。 1.檔案的開啟和關閉 開啟和關閉 fopen()函式 FILE *fopen(char *filename, *type); filename:可以包

Qt總結之五:檔案操作

  一、簡介        通過QFile、QDir、QFileInfo和QFileSystemWatcher類簡單介紹對檔案和目錄的一些操作。對文字流和資料流沒有太多的介紹,還有一些Qt資源、統一資源定位符、緩衝區可以在以後應用中加上。

RandomAccessFile隨機檔案操作類講解

private FileAccessI fileAccessI; private File file = null; private int lstart = 0; String dirName = ""; System.out.println("下載時接收到的內容:" + new String(byt

C檔案操作總結

FILE *fopen( const char *filename, const char *mode ); 一、對已經存在的檔案進行讀寫 mode: “r”—— Opens for reading. “r+”—- Opens for

oracle檔案--利用utl_file包對磁碟檔案操作

摘要: 使用者提出一個需求,即ORACLE中的一個表儲存了照片資訊,欄位型別為BLOB,要求能匯出成檔案形式. 本想寫個C#程式來做,後來想起ORACLE有很多包,功能很好很強大,於是網上參考了些文章完成了. 主要是用了ORACLE的兩個包:UTL_FILE和DBMS_L

(C/C++) FILE 檔案操作

per use () eat col 在操作 har 意思 etl 在C/C++ 讀寫檔案操作比較常見應該是利用 FILE、ifstream、ofstream 在這篇筆記裡頭記錄 FILE、fstream 使用方法及操作 1 #include <iostream&

Python 檔案相關操作總結( txt 檔案、複製檔案、獲得檔案列表等)

  本文平時程式設計中對於出現的 txt 的讀與寫入的相關方法彙總,因為是在學習過程中逐漸發現逐漸新增的,所以可能不會很全。但是我會保證持續的更新,使其趨於完善。   本片博文參考多篇博文彙總而成且在必要出添加了引用。 1. python獲取檔案路徑、檔名、字

9.3Python檔案操作(3):檔案的位元組模式

@概述 通過基本讀寫模式(只讀r,覆寫w,追加a,創寫x)我們可以方便地操作字元流檔案的讀寫; 對於位元組流檔案(一切非字元型檔案,包括媒體檔案、可執行檔案、壓縮包、等等),我們則需要使用位元組讀寫

檔案開啟關閉與等基本操作 C++

首先在c++中想要操作檔案流,必須定義標頭檔案<fstream>而且檔案流不像標準I/O物件,所以在使用之前必須呼叫相對應的建構函式來構造建流物件。第一可以直接呼叫建構函式ifstream ifs// 定義檔案輸入物件 ofstream ofs //定義檔案輸出

Java 檔案任意位置操作(首尾都可以)

public static void fileOperationInAnyLocation(String filePath) { Path path = Paths.get(filePath);