辅助功能*

Jeff Swartz

Jeff Swartz

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

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

构建文本文件编辑器

我们特意将 Text Editor 范例应用程序设计得很简单 (见图 1), 旨在向您介绍有关在 Adobe AIR 中处理文件的基础知识。具体而言, 您将学习以下内容:

  • 设置 File 对象, 使其指向某个文件路径
  • 获取文件特定于系统的路径 (nativePath)
  • 使用 FileMode 和 FileStream 类从文件读取数据
  • 使用 FileMode 和 FileStream 类向文件写入数据
  • 使用事件来处理异步进程

Flex 文本编辑器

图 1。本范例应用程序是一个处理纯文本文件的简易编辑器。

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

要求

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

Adobe AIR

Adobe Flex Builder 3

范例文件:

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

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

必备知识

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

测试应用程序

下载并启动应用程序的安装程序 (TextEditor.air), 从而安装此应用程序。此应用程序是一个处理纯文本文件的简易且直观的编辑器。此应用程序使用 UTF-8 编码读写所有文本文件。

了解代码

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

将 File 对象指向文件

appCompleteHandler() 方法设置 defaultFile File 对象, 使其指向预定义的路径:

defaultFile = File.documentsDirectory.resolvePath("test.txt");

此代码设置 File 对象, 使其指向用户文档目录中的 test.txt 文件。在 Windows 中, 此目录为“我的文档”。在 Mac OS 中, 此目录为 /Users/userName/Documents。

如果用户尚未选择文件路径, 则稍后会将 defaultFile 文件传递至 Open (打开) 和 Save As (另存为) 弹出窗口。

读取文件

openFile() 方法中包含用于打开文件选择器对话框的代码。用户选择文件并单击“确定”按钮后, 即调用 fileOpenSelected() 方法。此方法首先初始化 file 对象, 使其指向用户所指定的路径:

currentFile = event.file;

接下来关闭 stream FileStream 对象 (如果该对象当前已打开文件), 并初始化 stream FileStream 对象:

if (stream != null)
{
     stream.close();
}
stream = new FileStream();
stream.openAsync(currentFile, FileMode.READ);

注意: openAsync() 方法的 fileMode 参数设置为 FileMode.READ。这样即可读取文件。

还设置了事件处理函数, 用于响应 completeioError 事件:

stream.addEventListener(Event.COMPLETE, fileReadHandler);
stream.addEventListener(IOErrorEvent.IO_ERROR, readIOErrorHandler);

AIR 开始异步读取文件, 而运行时自动开始读入文件并引发事件。请注意, 可以在调用 openAsync() 方法之后再添加这些事件侦听器, 这是因为运行时在响应任何事件之前将完整地执行此 ActionScript 代码 (调用 addEventListener() 方法的代码块)。

注意: 本范例应用程序展示如何异步读取文件。通过在打开文件时调用 open() 方法而非调用 openAsync() 方法, 还可以同步读取文件。有关详细信息, 请参阅处理文件系统*

如果 stream 对象调度 ioError 事件, 则 readIOErrorHandler() 将对最终用户显示错误消息。

将文件完全读入后, stream 对象调度 complete 事件, 而 fileReadHandler() 方法读取并处理文件。

stream 对象的 readUTFBytes() 方法从指定数量的字节读取 UTF-8 字符, 从而返回一个字符串。由于 stream 对象刚刚调度了一个 complete 事件, 因此 bytesAvailable 属性表示文件的总长度, 并将其作为调用的 length 属性传递至 readUTFBytes() 方法:

var str:String = stream.readUTFBytes(stream.bytesAvailable);

以下代码将文件中每行的结尾字符替换为 \n 换行符, 该换行符用于 SWF 文件的 TextField 对象中。然后, 此代码将该字符串赋给 Text 控件的 text 属性:

var lineEndPattern:RegExp = new RegExp(File.lineEnding, "g");
str = str.replace(lineEndPattern, "\n");
mainTextField.text = str;

向文件写入数据

saveFile() 方法包含用于向文件写入文本的代码。

首先, 该方法检查是否已设置了 File 主对象:

if (currentFile)

用户首次打开应用程序时以及用户单击 New (新建) 按钮时, 尚未定义 currentFile 对象。如果未定义 currentFile, 则 (在 else 块中) 调用 saveAs() 方法, 让用户选择一个文件路径来保存文件。

接下来关闭 stream FileStream 对象 (如果其当前已打开), 然后将其初始化:

if (stream != null)
{
    stream.close();
}
stream = new FileStream();
stream.openAsync(currentFile, FileMode.WRITE);

请注意, 将 openAsync() 方法的 mode 参数设置为 FileMode.WRITE。这样即可写入文件。

还设置了一个事件处理函数, 用于响应任何 ioError 事件:

stream.addEventListener(IOErrorEvent.IO_ERROR, writeIOErrorHandler);

以下代码将 SWF 文件的 TextField 对象中所使用的“\n”换行符替换为文件系统中文本文件中每行所使用的结尾字符 (File.lineEnding)。然后此代码将字符串赋给 Text 控件的 text 属性:

var str:String = mainTextField.text;
str = str.replace(/\r/g, "\n");
str = str.replace(/\n/g, File.lineEnding);

stream 对象的 writeUTFBytes() 方法以 UTF-8 格式向文件写入字符串, 然后关闭文件:

stream.writeUTFBytes(str);
stream.close();

如果 stream 对象调度 ioError 事件, 则 writeIOErrorHandler() 将对最终用户显示错误消息。

关于作者

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