zoukankan      html  css  js  c++  java
  • AIR文件操作(三):使用FileStream对象读写文件

    快速上手例:

    例1.读xml

    1. var testXML:XML;
    2. var file:File = File.documentsDirectory.resolvePath("Mousebomb/test.xml");
    3. var fileStream:FileStream = new FileStream();
    4. fileStream.open(fileFileMode.READ);
    5. testXML = XML(fileStream.readUTFBytes(fileStream.bytesAvailable));
    6. fileStream.close();

    例中使用readUTFBytes()方法读取内容并转换为XML对象。

    例2.写xml

    1. var testXML: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"?>';
    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. var myFile:File = File.documentsDirectory.resolvePath("Mousebomb/site.txt");
    2. var myFileStream:FileStream = new FileStream();
    3. myFileStream.open(myFileFileMode.UPDATE);
    4. myFileStream.position = 8;
    5. myFileStream.writeUTFBytes("hello");

    该例在位置8处写入UTF编码的字符串“hello”

    新打开的FileStream对象的position值为0,在读文件操作前,position的值必最小为0并小于文件总字节数。
    position的值仅会在以下情况下改变:

    1. 直接设置该属性值
    2. 执行读取操作
    3. 执行写入操作

    当执行读/写操作时,position的值会立即自增读/写的字节数,再次执行读/写操作时会从新的position位置开始:

    1. var myFile:File = File.documentsDirectory.resolvePath("Mousebomb/test.txt");
    2. var myFileStream:FileStream = new FileStream();
    3. myFileStream.open(myFileFileMode.UPDATE);
    4. myFileStream.position = 4000;
    5. trace(myFileStream.position)// 4000
    6. myFileStream.writeBytes(myByteArray0200);
    7. trace(myFileStream.position)// 4200

    position有一个例外:若文件打开模式设置为append(追加模式),则position属性不会随着写操作变化。在追加模式下,数据总是往文件末尾写,与position无关。

    异步方式打开文件,写数据操作在下一行代码执行时并没有结束。这怎么办呢?没关系,你可以按顺序的调用多个异步操作,AIR运行环境会逐个执行:

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

    该例会输出:
    started.
    finished.

    你可以在异步读写操作调用后,立即设置position的值,下次读写操作将换作从那个位置开始。比如:

    1. var myFile:File = File.documentsDirectory.resolvePath("Mousebomb/test.txt");
    2. var myFileStream:FileStream = new FileStream();
    3. myFileStream.openAsync(myFileFileMode.UPDATE);
    4. myFileStream.position = 4000;
    5. trace(myFileStream.position)// 4000
    6. myFileStream.writeBytes(myByteArray0200);
    7. myFileStream.position = 300;
    8. trace(myFileStream.position)// 300

    3. 根据数据格式,选择合适的读写操作
    硬盘上的每个文件都是字节集合。在AS中,文件中的数据总是可以描述为ByteArray.比如下面的代码把文件数据读取到bytes这个ByteArray中:

    1. var myFile:File = File.documentsDirectory.resolvePath("Mousebomb/test.txt");
    2. var myFileStream:FileStream = new FileStream();
    3. myFileStream.addEventListener(Event.COMPLETEcompleted);
    4. myFileStream.openAsync(myFileFileMode.READ);
    5. var bytes:ByteArray = new ByteArray();
    6. function completeHandler(event:Event):void
    7. {
    8. myFileStream.readBytes(bytes0myFileStream.bytesAvailable);
    9. }

    下面的代码把数据从bytes这个ByteArray中写入文件:

    1. var myFile:File = File.documentsDirectory.resolvePath("Mousebomb/test.txt");
    2. var myFileStream:FileStream = new FileStream();
    3. myFileStream.open(myFileFileMode.WRITE);
    4. myFileStream.writeBytes(bytes0bytes.length);

    往往我们并不希望把数据作ByteArray处理,有时候要处理的文件是特定格式,比如文件中的数据是字符串。因此FileStream类也包含ByteArray以外的数据格式读写方法,比如readMultiByte()方法,可将文件读取暂存为字符串,如下代码:

    1. var myFile:File = File.documentsDirectory.resolvePath("Mousebomb/test.txt");
    2. var myFileStream:FileStream = new FileStream();
    3. myFileStream.addEventListener(Event.COMPLETEcompleted);
    4. myFileStream.openAsync(myFileFileMode.READ);
    5. var str:String = "";
    6. function completeHandler(event:Event):void
    7. {
    8.    str = myFileStream.readMultiByte(myFileStream.bytesAvailable"iso-8859-1");
    9. }

    readMultiByte()的第二个参数(本例中为“iso-8859-1”)指定了ActionScript用来解释的文本格式。ActionScript支持通用字符集编码,具体罗列在http://livedocs.macromedia.com/flex/2/langref/charset-codes.html

    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文件操作》结束。所有知识点来自:官方文档。
    (本文若有不当之处,敬请指出。)
    参考文献:http://livedocs.adobe.com/air/1/devappsflash/help.html?content=dg_part_6_1.html
    http://livedocs.macromedia.com/flex/2/langref/charset-codes.html
    http://www.adobe.com/go/learn_air_aslr

  • 相关阅读:
    Firemonkey 控件设定字型属性及颜色
    ListView 使用 LiveBindings 显示超过 200 条记录
    Firemonkey ListView 获取项目右方「>」(Accessory) 事件
    XE7 Update 1 选 iOS 8.1 SDK 发布 iPhone 3GS 实机测试
    Firemonkey Bitmap 设定像素颜色 Pixel
    Firemonkey 移动平台 Form 显示使用 ShowModal 范例
    XE7 提交 App(iOS 8)提示「does not contain the correct beta entitlement」问题修复
    XE7 Android 中使用 MessageDlg 范例
    导出 XE6 预设 Android Style (*.style) 档案
    修正 Memo 設定為 ReadOnly 後, 無法有複製的功能
  • 原文地址:https://www.cnblogs.com/mfryf/p/2348105.html
Copyright © 2011-2022 走看看