快速上手例:

例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(file, FileMode.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(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. var myFile:File = File.documentsDirectory.resolvePath("Mousebomb/test.txt");
  2. var myFileStream:FileStream = new FileStream();
  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. var myFile:File = File.documentsDirectory.resolvePath("Mousebomb/test.txt");
  2. var myFileStream:FileStream = new FileStream();
  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. var myFile:File = File.documentsDirectory.resolvePath("Mousebomb/test.txt");
  2. var myFileStream:FileStream = new FileStream();
  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. var myFile:File = File.documentsDirectory.resolvePath("Mousebomb/test.txt");
  2. var myFileStream:FileStream = new FileStream();
  3. myFileStream.addEventListener(Event.COMPLETE, completed);
  4. myFileStream.openAsync(myFile, FileMode.READ);
  5. var bytes:ByteArray = new ByteArray();
  6. function completeHandler(event:Event):void
  7. {
  8. myFileStream.readBytes(bytes, 0, myFileStream.bytesAvailable);
  9. }

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

  1. var myFile:File = File.documentsDirectory.resolvePath("Mousebomb/test.txt");
  2. var myFileStream:FileStream = new FileStream();
  3. myFileStream.open(myFile, FileMode.WRITE);
  4. myFileStream.writeBytes(bytes, 0, bytes.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.COMPLETE, completed);
  4. myFileStream.openAsync(myFile, FileMode.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

本文转自博客园知识天地的博客,原文链接:AIR文件操作(三):使用FileStream对象读写文件,如需转载请自行联系原博主。

AIR文件操作(三):使用FileStream对象读写文件相关推荐

  1. Flash AIR文件操作:使用FileStream对象读写文件

    快速上手例: 例1.读xml var testXML:XML; var file:File = File.documentsDirectory.resolvePath("Mousebomb/ ...

  2. C语言文件操作(三) —— 文件的随机读写(fseek / lseek)

            目录 1.什么是文件的随机读写 2.认识文件随机读写函数 (1) fseek 函数 -- 移动文件指针的位置 (2) ftell 函数 -- 告知当前文件指针相对于起始位置的偏移量 ( ...

  3. python 文件操作不被打断_python学习六文件操作和异常处理

    1.文件的定义和类型 什么是文件呢? 文件是数据的抽象和集合 文件是存储在辅助存储器上的数据序列 文件是存储的一种 文件有哪些类型呢? 本质上所有文件以二进制储存,不过又可以分为文本文件和二进制文件 ...

  4. python文件操作的一般步骤_4.1Python文件基本操作

    Python文件基本操作 文件的读写方法有六种:W,R,A,W+,A+,R+ 读模式: # -*-coding:utf-8 -*- __author__ = 'xiaojiaxin' __file_n ...

  5. python读取文件路径乱码 linux_Python之pandas读写文件乱码的解决方法

    Python之pandas读写文件乱码的解决方法 python读写文件有时候会出现 'XXX'编码不能打开XXX什么的,用记事本打开要读取的文件,另存为UTF-8编码,然后再用py去读应该可以了.如果 ...

  6. C语言基础14——文件操作。文本文件或二进制文件读写。通讯录的改造。文件缓冲区讲解

    目录 为什么使用文件? 什么是文件? 文件的打开和关闭 文件指针 文件的打开和关闭 文件的打开方式 流 重定义文件 文件流 文件的顺序读写 以字符形式读写文本文件 fputc()函数 fgetc()函 ...

  7. (0053)iOS开发之沙盒(sandbox)机制和文件操作(三)

    1.在Documents里创建目录 创建一个叫test的目录,先找到Documents的目录, NSArray *paths = NSSearchPathForDirectoriesInDomains ...

  8. c/c++入门教程 - 2.5 文件操作、fstream(write写文件、read读文件、ios::binary二进制文件读写)

    目录 2.5 文件操作 2.5.1 文本文件 2.5.1.1 写文件 2.5.1.2 读文件 2.5.2 二进制文件 2.5.2.1 二进制写文件 2.5.2.2 二进制读文件 2.5 文件操作 程序 ...

  9. java 追加写入hdfs_java操作之HDFS-创建-删除目录-读写文件-追加写文件

    Hadoop文件操作之HDFS,创建.删除目录,读写文件,追加写文件 package hadoop.hadoop_demo; import java.io.InputStream; import ja ...

最新文章

  1. 【C#】登陆次数限制
  2. 3 css 奖品出现弹出动画_【技术】nuxt中引入wow和animate.css 页面随滚动条出现动画...
  3. ssh: connect to host 192.168.57.131 port 22: Conne
  4. python时间差中 seconds 和 total_seconds 区别
  5. 网络推广外包专员浅析网络推广外包能否离开网站外链?
  6. python笔记:jieba(中文分词)
  7. Promise使用,return的运用,解决回调地狱
  8. Visual Studio-查看汇编代码
  9. Linux使用Blowfish生成密码,linux批量生成密码
  10. vue脚手架安装 axios 安装 配置 轮播图
  11. springboot 集成J2Cache
  12. 苹果cookie是打开还是关闭_如何避免苹果safari自带浏览器“跟踪”你的信息!
  13. 巴黎世家土味病毒营销,B端创业初期,如何用营销壮大你的种子用户?
  14. linux下删除一个环境变量,Linux 添加环境变量和删除环境变量
  15. 编程环境和软件工具安装手册
  16. 使用C语言来访问ARM寄存器的语法
  17. centos6.8经典实用大全、教程
  18. C语言 使用数组索引与指针索引 在循环中对编译器优化的影响及耗时分析
  19. Python脚本破解Linux口令(crypt模块)
  20. 操作系统——页面置换算法练习题

热门文章

  1. jQuery源码研究学习笔记(二)
  2. CSS的@media与@media screen,媒体查询
  3. c语言让系统蓝屏,0x000000116,教您解决电脑蓝屏代码0x000000116
  4. 复数四则运算 (15 分)
  5. 判断上三角矩阵 (15 分)
  6. 使用C语言----修改密码
  7. layui的登录ajax,layui如何实现登录功能
  8. H3C 环路避免机制六:触发更新
  9. redis 系列10 字符串对象
  10. MySQL 基本应用 count() 与 group by