辅助功能*

Jeff Swartz

Jeff Swartz

高级技术文档撰写工程师
Adobe

出版日期:
2008 年 2 月 28 日
用户级别:
中/高级
产品:
Adobe AIR

读写 XML 首选参数文件

本范例应用程序可读写与其位置和大小相关的数据以及保存日期。另外, 还会在应用程序打开时, 根据这些数据确定窗口位置。具体而言, 本范例应用程序将演示 Adobe AIR 的以下功能:

  • 读写文本文件
  • 指定 Adobe AIR 应用程序存储目录中的文件
  • 修改 AIR 应用程序窗口的位置、大小和可见性
  • 响应 Window 对象调度的 closing 事件

XML 首选参数应用程序

图 1。通过本范例应用程序可以指定 XML 首选参数。

注意: 本范例应用程序按原样提供, 用于教学目的。

要求

若要充分利用本篇文章, 您需要以下软件和文件:

Adobe AIR

Adobe Flex Builder 3

范例文件:

本范例应用程序包括以下文件:

  • PrefsXMLDemo.mxml: 应用程序主文件 (Flex 的 MXML 格式), 其中包括本文所讨论的代码
  • PrefsXMLDemo-app.xml: AIR 应用程序描述符文件
  • AIR 图标文件范例

必备知识

应具备使用 Flex Builder 或 Flex SDK 构建应用程序的一般经验。有关使用此快速入门指南的详细信息, 请参阅用 Flex 构建快速入门范例应用程序

测试应用程序

本应用程序可读写与其位置和大小相关的数据以及保存日期。另外, 还会在应用程序打开时, 根据这些数据确定窗口位置。首选参数保存在包含 XML 数据的文本文件中。应用程序在读取时将这些数据转换为 XML 对象, 在写入时将 XML 数据转换为文本。若要测试此应用程序, 请按照以下步骤操作:

  1. 打开应用程序。
  2. 调整窗口大小并将窗口重新定位。
  3. 单击 Save Preferences (保存首选参数) 按钮将数据写入 XML 文件。
  4. 重新启动应用程序, 即可看到首选参数生效。

了解代码

注意: 对于文件的 MXML 代码所使用的全部 Flex 组件, 本文将不一一介绍。有关详细信息, 请参阅《Flex 3 语言参考》*

从 XML 文件读取数据

appCompleteHandler() 方法初始化 prefsFile File 对象, 将其指向预定义的路径, 然后调用 readXML() 方法, 该方法读取数据:

prefsFile = File.applicationStorageDirectory;
prefsFile = prefsFile.resolvePath("preferences.xml");
readXML();

File.applicationStorageDirectory 指向 AIR 应用程序的存储目录, 该目录的定义对于每个 AIR 应用程序都是独一无二的。

appCompleteHandler() 方法还设置事件处理函数, 用于响应窗口的关闭 (此时将首选参数数据保存至文件):

stage.nativeWindow.addEventListener(Event.CLOSING, windowClosingHandler);

readXML() 方法设置 File 对象和 FileStream 对象。调用 open() 方法时将 fileMode 参数设置为 FileMode.READ, 这样 FileStream 对象就可以从文件中读取数据:

stream = new FileStream();
stream.open(prefsFile, FileMode.READ);

stream 对象的 open() 方法同步打开文件, 并开始将数据读入读取缓冲区。

processXMLData() 事件方法处理 XML 数据, 然后关闭文件。FileStream 对象的 bytesAvailable 属性是读取缓冲区中的字节数, 即 (从同步读取文件开始) 来自文件的所有字节:

prefsXML = XML(stream.readUTFBytes(stream.bytesAvailable));
stream.close();

将应用程序窗口重新定位并调整窗口大小

application.xml 文件定义应用程序的属性 (property), 其中将 initialWindow 属性 (property) 的 visible 属性 (attribute) 设置为 false。使窗口可见之前调整窗口大小并将其重新定位。

Stage 对象的 window 属性包含 AIR 窗口的属性。

processXMLData() 方法根据 (从首选参数文件读入的) XML 首选参数对象中的数据调整窗口大小并将其重新定位:

stage.nativeWindow.x = prefsXML.windowState.@x;
stage.nativeWindow.y = prefsXML.windowState.@y;
stage.nativeWindow.width = prefsXML.windowState.@width;
stage.nativeWindow.height = prefsXML.windowState.@height;

注意: 此段代码示例使用 E4X 表示法, 该表示法是在 ActionScript 3.0 中引入的。例如, prefsXML.windowState.@xprefsXML XML 对象的 windowState 属性 (property) 的 x 属性 (attribute) 值。有关详细信息, 请参阅《ActionScript 3.0 编程》一书的处理 XML* 一章。

readXML() 方法在 processXMLData() 方法返回之后使窗口可见:

stage.nativeWindow.visible = true;

将 XML 数据写入文件

writeXMLData() 将 XML 数据转换为字符串, 向字符串的开头添加 XML 声明, 并将每行结尾字符替换为特定于平台的每行结尾字符 (由 AIR File.lineEnding 常量表示):

var outputString:String = '<?xml version="1.0" encoding="utf-8"?>\n';
outputString += prefsXML.toXMLString();
outputString = outputString.replace(/\n/g, File.lineEnding);

然后设置 FileStream 对象, 并使用该对象写入数据。注意, 在 open() 方法中指定 FileMode.WRITE 作为 fileMode 参数。这指定 FileStream 对象可以写入文件 (并将在写入之前截断任何现有数据):

stream = new FileStream();
stream.open(prefsFile, FileMode.WRITE);

接下来, 调用 writeUTFBytes() 方法, 该方法 (以 UTF-8 数据的形式) 将 XML 数据的字符串版本写入文件:

stream.writeUTFBytes(outputString);

由于已经 (使用 open() 方法) 为同步操作打开过此文件, 并且 Window 对象的 closing 事件的事件处理函数内包括了 write 方法, 因此文件写入将在窗口 (和应用程序) 实际关闭之前完成。本应用程序使用同步读写操作, 因为 XML 首选参数文件相对较小。如果要异步写入文件, 则要取消 closing 事件, 并通过在 FileStream 对象所调度的 outputProgress 事件的事件处理函数中调用 NativeApplication.nativeapplication.exit() 方法, 显式关闭应用程序。

关于作者

Jeff Swartz 于 1992 年开始他在 Macromedia (现在为 Adobe Systems)的职业生涯。目前, 他是一名 Adobe AIR 技术文档撰写工程师。Jeff 拥有伊利诺斯大学乌尔班纳-香巴尼分校的计算机科学与数学专业学士学位, 并曾就读于爱丁堡大学人工智能系。旧金山湾地区附近的听众都曾“领略”过 Jeff 在长号演奏方面的艺术风采。他还曾是 Vienna Beef Ltd. 的 Big Frank (舞蹈高手)。