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

图 1。本范例应用程序是一个处理纯文本文件的简易编辑器。
注意: 本范例应用程序按原样提供, 用于教学目的。
若要充分利用本篇文章, 您需要以下软件和文件:
本范例应用程序包括以下文件:
应具备使用 Flex Builder 或 Flex SDK 构建应用程序的一般经验。有关使用此快速入门指南的详细信息, 请参阅用 Flex 构建快速入门范例应用程序。
下载并启动应用程序的安装程序 (TextEditor.air), 从而安装此应用程序。此应用程序是一个处理纯文本文件的简易且直观的编辑器。此应用程序使用 UTF-8 编码读写所有文本文件。
注意: 对于文件的 MXML 代码所使用的全部 Flex 组件, 本文将不一一介绍。有关详细信息, 请参阅《Flex 3 语言参考》*。
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。这样即可读取文件。
还设置了事件处理函数, 用于响应 complete 和 ioError 事件:
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() 将对最终用户显示错误消息。