【发布时间】:2009-09-03 04:16:23
【问题描述】:
我正在尝试在 AIR 中执行以下操作:
- 浏览到文本文件
- 读取文本文件并将其存储在字符串中(最终存储在数组中)
- 用分隔符 \n 分割字符串并将生成的字符串放入数组中
- 在将数据发送到网站(mysql 数据库)之前对其进行操作
我正在处理的文本文件大小在 100-500mb 之间。到目前为止,我已经能够完成步骤 1 和 2,这是我的代码:
<mx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
import flash.filesystem.*;
import flash.events.*;
import mx.controls.*;
private var fileOpened:File = File.desktopDirectory;
private var fileContents:String;
private var stream:FileStream;
private function selectFile(root:File):void {
var filter:FileFilter = new FileFilter("Text", "*.txt");
root.browseForOpen("Open", [filter]);
root.addEventListener(Event.SELECT, fileSelected);
}
private function fileSelected(e:Event):void {
var path:String = fileOpened.nativePath;
filePath.text = path;
stream = new FileStream();
stream.addEventListener(ProgressEvent.PROGRESS, fileProgress);
stream.addEventListener(Event.COMPLETE, fileComplete);
stream.openAsync(fileOpened, FileMode.READ);
}
private function fileProgress(p_evt:ProgressEvent):void {
fileContents += stream.readMultiByte(stream.bytesAvailable, File.systemCharset);
readProgress.text = ((p_evt.bytesLoaded/1048576).toFixed(2)) + "MB out of " + ((p_evt.bytesTotal/1048576).toFixed(2)) + "MB read";
}
private function fileComplete(p_evt:Event):void {
stream.close();
//fileText.text = fileContents;
}
private function process(c:String):void {
if(!c.length > 0) {
Alert.show("File contents empty!", "Error");
}
//var array:Array = c.split(/\n/);
}
]]>
</mx:Script>
这是 MXML
<mx:Text x="10" y="10" id="filePath" text="Select a file..." width="678" height="22" color="#FFFFFF" fontWeight="bold"/>
<mx:Button x="10" y="40" label="Browse" click="selectFile(fileOpened)" color="#FFFFFF" fontWeight="bold" fillAlphas="[1.0, 1.0]" fillColors="[#E2E2E2, #484848]"/>
<mx:Button x="86" y="40" label="Process" click="process(fileContents)" color="#FFFFFF" fontWeight="bold" fillAlphas="[1.0, 1.0]" fillColors="[#E2E2E2, #484848]"/>
<mx:TextArea x="10" y="70" id="fileText" width="678" height="333" editable="false"/>
<mx:Label x="10" y="411" id="readProgress" text="" width="678" height="19" color="#FFFFFF"/>
第 3 步是我遇到一些麻烦的地方。我的代码中有 2 行被注释掉,这两行都会导致程序冻结。
fileText.text = 文件内容;尝试将字符串的内容放入 textarea
var array:Array = c.split(/\n/);尝试通过分隔符换行符分割字符串
此时可以使用一些输入... 我什至会以正确的方式解决这个问题吗? flex/air 可以处理这么大的文件吗? (我假设是这样) 这是我第一次尝试做任何类型的弹性工作,如果你发现我做错了其他事情或者可以做得更好,我会很感激提醒!
谢谢!
【问题讨论】:
标签: apache-flex actionscript-3 air parsing text-files