• 使用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(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/flash.com/article/flex' target='_blank'>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操作它们的数据,得对其结构十分了解。

    (本文转载)

  • 相关阅读:
    建持续集成
    Apache通用日志工具commonslogging和Log4j使用总结
    subversion(SVN)常见问题及其解决方法
    UML类图的相关名词解释
    SVN项目的目录布局
    敏捷开发流程总结
    敏捷开发实践
    卓有成效的敏捷开发流程
    字符串反转操作
    转:图片水印 http://www.cnblogs.com/xiaoge_com/archive/2009/09/10/1564216.html
  • 原文地址:https://www.cnblogs.com/cymhappy/p/4326185.html
Copyright © 2020-2023  润新知