如何使用 Actionscript 3 读取文本文件?

How to Read a Text file Using Actionscript 3?

我正在尝试读取我的 air 项目中的文本文件。它实际上是 TinkerProxy 使用的配置文件。到目前为止我有以下内容:

//Read settings from TinkerProxy Config File
var TextFileLoader:URLLoader = new URLLoader();
var ArrayOfLines:Array;
TextFileLoader.addEventListener(Event.COMPLETE, onLoaded);
TextFileLoader.load(new URLRequest("/tinkerproxy-2_0/serproxy.cfg"));
//TextFileLoader.dataFormat    = URLLoaderDataFormat.VARIABLES;

function onLoaded(e:Event):void {
    ArrayOfLines = e.target.data.split(/\r/);
    trace(e.target.data);
}

trace(ArrayOfLines[0]);

我真正想做的是找到 'net_port1=5331' 条目并将“5331”存储在变量中。

这是文本文件的示例:

# Generated by TinkerProxy Configurator
# 

# Timeout in seconds
# 0 means infinite, no timeout

timeout=0
newlines_to_nils=false

comm_ports=1 

serial_device1=COM1
net_port1=5331
comm_baud1=9600
comm_databits1=8
comm_stopbits1=1
comm_parity1=none

该文件是自动生成的,因此我无法对其进行编辑(或者更确切地说,我想在生成时阅读它。)

我可以通过 trace(e.target.data) 查看数据,但我无法通过 trace(ArrayOfLines[0]); 访问数据。

我错过了什么?

提前致谢。

您可能需要在 \n (Unix) or \r\n (Windows) 上拆分,而不是 \r

通常当从文件系统加载文本文件并分成几行时,我通过这样做来规范化行结尾:

var lines:Array = text.replace(/\r\n/g, "\n").split("\n");

然后您可以遍历这些行并根据需要解码每一行。该文件似乎类似于 .properties format,在 AS3 中没有针对它的内置解析器(如 XML、JSON 或 URLVariables),但它是一种非常简单的格式。例如,这个:

var props:Object = {};
for each(var line:String in lines){
    // skip blank lines and comment lines
    if(line == "" || line.charAt(0) == "#")
        continue;
    var arr:Array = line.split("=");
    if(arr.length == 2)
        props[arr[0]] = arr[1];
}

trace(JSON.stringify(props, null, 2))

输出这个:

{
  "comm_parity1": "none",
  "comm_ports": "1 ",
  "newlines_to_nils": "false",
  "comm_baud1": "9600",
  "serial_device1": "COM1",
  "comm_databits1": "8",
  "timeout": "0",
  "comm_stopbits1": "1",
  "net_port1": "5331"
}

允许您按名称访问属性:

trace(props.net_port1); // "5331"

(请注意,所有值都是字符串,因此例如 newlines_to_nils 不是 false,而是 "false"。)

或者,您可以搜索您正在寻找的密钥并仅提取您想要的数据:

var key:String = "net_port1=";
var index:int = text.indexOf(key);
if(index != -1){
    // extract text after the desired search key
    var value:String = text.substring(index + key.length);
    // parseInt will read until it hits a non-numeric character
    var net_port1:int = parseInt(value);
    trace(net_port1); // 5331
}

这是对我有用的解决方案。再次感谢亚伦对属性的回答。我以后可能会用到它。

//Read settings from TinkerProxy Config File
var TextFileLoader:URLLoader = new URLLoader();
var ArrayOfLines:Array;
var Port:int;
var COM:int;
TextFileLoader.addEventListener(Event.COMPLETE, onLoaded);
TextFileLoader.load(new URLRequest("/tinkerproxy-2_0/serproxy.cfg"));

function findSubstring(array:Array, string:String):int {
    for(var i:int = 0; i < array.length; i++){
        if(array[i].indexOf(string) > -1){
            return i;  //Index of Substring
        }
    }
    return -1; //Not Found
}

function onLoaded(e:Event):void {
    ArrayOfLines = e.target.data.split(String.fromCharCode(13));

    if(findSubstring(ArrayOfLines, "net_port") > -1){
        Port = Number(ArrayOfLines[findSubstring(ArrayOfLines, "net_port")].split("=")[1]);
    }
    else{
        Port = 5331; //Default if not port is found.
    }

    if(findSubstring(ArrayOfLines, "serial_device1") > -1){
        COM  = Number(ArrayOfLines[findSubstring(ArrayOfLines, "serial_device1")].split("serial_device1=COM")[1]);
    }
    else{
        COM  = 1;   //Default if not port is found.
    }

    trace("COM: " + COM + " Port: " + Port);
}