7yue's Weblog

Thinking in RIA Solutions...2470,8514,1020的生活演绎

« 你用了谷歌音乐泡泡搜歌了么?突然发现我也上视频了 »

AIR APIs详解 - 文件访问系统 part7

Part7的部分,我们开始讨论AIR的flash.filesystem中的FileStream类,由名字我们就能猜出来这个类是用来操作文件流的,比如,读,写,更新等操作。对于AIR应用读,写,更新文件中的内容,不能单独靠FileStream来完成,还需要使用File和FileMode两个类来协同完成。这个方式在很多编程的环节都类似,比如操作一个Stream Video,你需要使用NetConnection,NetStream和Video三个类来共同完成视频的请求,加载和关闭等逻辑。在我们开始着重讨论FileStream前,我们先来简单看一下FileMode类,这个类很简单,我们经常用到这个类的四个静态常量,分别是APPEND,READ,UPDATE和WRITE。关于这个四个静态常量的解释,我偷个懒,直接把文档描述搬来给各位看:
APPEND
用于要在写入模式下打开的文件,并将所有写入的数据附加到文件末尾。打开文件时,会创建任何不存在的文件。
READ
用于要在只读模式中打开的文件。文件必须存在(不创建缺少的文件)。
UPDATE
用于要在读/写模式中打开的文件。打开文件时,会创建任何不存在的文件。
WRITE
用于要在只写模式中打开的文件。打开文件时,会创建任何不存在的文件,并截断任何现有的文件(删除其数据)。
我们在FileStream的open()和openAsync()方法中使用FileMode的四个静态常量来作为参数,以此来告知FileStream操作文件时应该使用的具体功能。
下面是一段Flex代码,是打开一个文本文件,并向里面写入信息:

<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical">
  <mx:Script>
    <![CDATA[
      private function createFile():void{
        var newFile:File=File.desktopDirectory.resolvePath("MyNewFile.txt");
        var fileStream:FileStream=new FileStream();
        fileStream.openAsync(newFile,FileMode.WRITE);
        fileStream.writeUTFBytes("这是写入的文本信息.\n这是写入的文本信息.\n这是写入的文本信息.\n");
        //fileStream.writeMultiByte("这是写入的文本信息.\n这是写入的文本信息.\n这是写入的文本信息.\n,"cn-gb");
        fileStream.close();
      }
    ]]>
  </mx:Script>
  <mx:Button label="写入文件" click="createFile()" horizontalCenter="0"/>
</mx:WindowedApplication>

你使用Flex Builder中的AIR项目运行这个Flex文件,你会发现桌面上的一个MyNewFile.txt被创建,打开后,其中是三行同样的文本信息。
上面代码运行的结果,会依照你的操作系统而变的不同。
在win环境下,用任意文本工具打开MyNewFile.txt文本,都可以正常显示结果。
在MAC环境下,文件被生成,如果你用第三方文本编辑器或者Pico打开该文件,你会发现这个Unicode文本文件的信息一切正常。

但是如果你用MACOS系统自身的文本编辑或者Office等软件去打开它,会发现,不论你如何调整这些软件的编码(即使你设置为unicode),打开这个文本文件全部是乱码,而不是正常的中文。目前,我的解决办法是使用writeMultiByte(注释掉writeUTFBytes这一行),然后专门指定其中的编码是cn-gb,这样就可以使用MACOS自带的软件或者Office正常打开查看了。
我猜想这是MACOS自带文本编辑和Office软件上一个默认设置所致,这些软件的默认设置全部是简体中文(MACOS)的方式,所以通过Unicode创建的带有中文的文本便无法被正确处理。总而言之,我们开发的AIR应用如果在使用FileStream进行文件写入的时候,不得不考虑跨平台的兼容方法(很庆幸AIR的确有),而对于WriteUTFBytes方法,如果你希望MAC系统的用户也正常看到信息,就最好谨慎考虑使用。毕竟生成文件后,让MAC用户修改软件配置或者通过命令行Pico查看文本信息显的不太符合简便操作的道理。如果你的应用只针对Win用户,请大胆的使用WriteUTFBytes方法。

Part 7就到这里,Part8将讲解读取,更新和后续添加文件信息的部分。
=============
连载索引:
AIR APIs详解 - 文件访问系统 part1
AIR APIs详解 - 文件访问系统 part2
AIR APIs详解 - 文件访问系统 part3
AIR APIs详解 - 文件访问系统 part4
AIR APIs详解 - 文件访问系统 part5
AIR APIs详解 - 文件访问系统 part6

  • quote 1.Song
  • 据说,运行flex builder 使用IBM JAVA 1.5编译的速度会更快一下,占用的内存也会小一些,我看到了网上有相关的设置说明,可我设置了以后还是提示错误,不知道问什么?请指教

    下面是设置的说明:
    http://www.adobe.com/support/documentation/en/flex/2/releasenotes_flex2_sdk.html

    http://www.cheng-fu.com/node/52
  • 2009-4-10 19:07:53 回复该留言
  • quote 3.Y.Boy
  • http://www.riahome.cn
  • 赐教两问题,希望看到都帮帮忙:

    1. 很多时候,我们都希望在安装软件时,提供一个设置参数的界面。而AIR应用的安装都是大统一的,都是没法在安装过程中让用户设置参数,如:是否开机自动运行之类的。

    2. 有时候像做桌面小工具一样(天气预报之类的),在桌面上可显示AIR应用,但不希望在任务栏里出现它,而只希望在系统托盘里出现小图标。

    以上两问题该如何解决?谢谢了
  • 2009-4-18 13:32:57 回复该留言
  • quote 4.DN
  • 想请问7yue大哥两个问题,分别是:
    AIR是不是能够做socket服务器?
    AIR是不是能够支持串口?
    Admin7yue 于 2009-4-23 12:30:26 回复
    AIR不能用作socket服务器,AIR可以支持串口,如果经过某些hack的化,呵呵。
  • 2009-4-21 8:58:47 回复该留言
  • quote 5.Y.Boy
  • http://www.riahome.cn
  • 又来打扰了:)
    提问:如果让失去系统焦点的AIR应用程序继续监听键盘事件?
    谢谢。
    Admin7yue 于 2009-4-23 12:34:45 回复
    目前不可以,我在MAC下做了测试的。我明白你的意思,比如一个录屏软件,它激活最小化后,系统焦点移动到另外的软件上去,比如你要录制的操作软件环境,你的录屏软件仍然可以捕获键盘快捷键事件进行操作响应。AIR目前还不可以。在MAC平台上和Win平台上关于失去焦点响应键盘的方法均不同。
  • 2009-4-23 11:55:32 回复该留言

日历

最新评论及回复

最近发表

Powered By Z-Blog 1.8 Walle Build 91204

Copyright 2007 www.7yue.com. Some Rights Reserved.
京ICP备05064035号