如何将文本文件数据加载至数组?附ActionScript代码片段咨询
如何在ActionScript中将文本文件数据加载到Vector数组中?
嘿,我看了你这段尝试加载文本数据到Vector的代码,先帮你揪几个潜在的问题,再给你适配不同文本格式的解决方案~
原代码里的几个关键问题
- Vector索引赋值报错:你直接用
Xcord[i] = int(iStr)这种方式给Vector赋值,但如果初始化时没指定长度(比如new Vector.<int>(225)),Vector默认长度是0,直接访问超出范围的索引会抛出RangeError,应该用push()方法来追加元素更安全。 readUTF()的误用:readUTF()是用来读取之前用writeUTF()写入的二进制内容的——它会先读一个16位的长度标识,再读对应长度的UTF-8字符串。如果你的文件是普通文本文件,没有这个长度前缀,用这个方法会读到完全不符合预期的内容。- 代码截断问题:你最后
trace(PixV...明显没写完,不过先聚焦核心的加载逻辑问题。
解决方案分两种情况(根据你的文本文件格式)
情况1:文本文件每行存储一组完整数据(比如 X值,Y值,像素值)
比如你的文本内容是这样的:
10,20,0xFF0000 30,40,0x00FF00 50,60,0x0000FF
对应的加载代码:
// 初始化文件流并打开目标文件 var fs:FileStream = new FileStream(); var targetFile:File = File.applicationDirectory.resolvePath("your_data.txt"); fs.open(targetFile, FileMode.READ); // 初始化存储数据的Vector var Xcord:Vector.<int> = new Vector.<int>(); var Ycord:Vector.<int> = new Vector.<int>(); var PixVal:Vector.<uint> = new Vector.<uint>(); // 读取整个文件内容并按行分割 var fullContent:String = fs.readUTFBytes(fs.bytesAvailable); var dataLines:Array = fullContent.split("\n"); // 遍历每一行解析数据 for each(var line:String in dataLines) { line = line.trim(); // 移除换行符和首尾空格 if(line.length === 0) continue; // 跳过空行 var dataParts:Array = line.split(","); // 确保一行有三个数据项 if(dataParts.length === 3) { Xcord.push(int(dataParts[0])); Ycord.push(int(dataParts[1])); // 如果像素值是十六进制字符串(比如0xFF0000),uint会自动识别 PixVal.push(uint(dataParts[2])); } } // 记得关闭文件流 fs.close(); // 测试输出验证结果 for(var i:int = 0; i < Xcord.length; i++) { trace(`X: ${Xcord[i]}, Y: ${Ycord[i]}, 像素值: ${PixVal[i].toString(16)}`); }
情况2:文本文件按行依次存储X、Y、像素值(每3行一组)
比如你的文本内容是这样的:
10 20 0xFF0000 30 40 0x00FF00
对应的加载代码:
var fs:FileStream = new FileStream(); var targetFile:File = File.applicationDirectory.resolvePath("your_data.txt"); fs.open(targetFile, FileMode.READ); var Xcord:Vector.<int> = new Vector.<int>(); var Ycord:Vector.<int> = new Vector.<int>(); var PixVal:Vector.<uint> = new Vector.<uint>(); var fullContent:String = fs.readUTFBytes(fs.bytesAvailable); var dataLines:Array = fullContent.split("\n"); // 每3行作为一组数据读取 for(var i:int = 0; i < dataLines.length; i += 3) { // 安全获取每行内容并去除空白 var xStr:String = dataLines[i]?.trim() || ""; var yStr:String = dataLines[i+1]?.trim() || ""; var pixStr:String = dataLines[i+2]?.trim() || ""; // 确保三个数据项都不为空 if(xStr && yStr && pixStr) { Xcord.push(int(xStr)); Ycord.push(int(yStr)); PixVal.push(uint(pixStr)); } } fs.close(); // 测试输出 for(var j:int = 0; j < Xcord.length; j++) { trace(`X: ${Xcord[j]}, Y: ${Ycord[j]}, 像素值: ${PixVal[j].toString(16)}`); }
额外提示
如果你的文件是二进制格式(之前用ActionScript的writeUTF()和writeUnsignedInt()写入的),那可以保留readUTF()和readUnsignedInt(),但要修正Vector的赋值方式,比如初始化时指定长度:
var Xcord:Vector.<int> = new Vector.<int>(225); var Ycord:Vector.<int> = new Vector.<int>(225); var PixVal:Vector.<uint> = new Vector.<uint>(225); for (var i:int = 0; i < 225; i++) { var iStr:String = fs.readUTF().trim(); // 去掉可能的换行符 Xcord[i] = int(iStr); var kStr:String = fs.readUTF().trim(); Ycord[i] = int(kStr); var pixelValue:uint = fs.readUnsignedInt(); PixVal[i] = pixelValue; trace(Xcord[i], Ycord[i], PixVal[i]); }
内容的提问来源于stack exchange,提问作者Ayman Radwan
相关产品推荐
相关产品推荐

