我使用FileReference从用户读取文件。我有一个变量,我想用所选文件的内容初始化。我创建了一个带有setter和getter的Model类。虽然这不起作用,因为它会告诉我一个错误,告诉我文件的末尾已到达。如何用文件更新变量?谢谢。
public class Main extends Sprite
{
public var fr:FileReference;
private var _model:Model;
private var button:Sprite;
public function Main():void
{
_model = new Model();
_model.addEventListener(Model.VALUE_CHANGED, fileLoaded);
trace(_model.getVariable());
}
protected function loadClicked(e:Event):void
{
fr = new FileReference();
fr.addEventListener(Event.SELECT, fileSelected);
fr.browse([new FileFilter("JSON Files (*.json)", "*.json")]);
}
public function fileSelected(event:Event):void
{
fr.addEventListener(Event.COMPLETE, fileLoaded);
fr.load();
}
public function fileLoaded(event:Event):void
{
try
{
var content:ByteArray = fr.data;
_model.setVariable(content.readUTFBytes(content.length));
}
catch (e:Error)
{
trace("Error");
}
}
}
public class Model extends EventDispatcher
{
public static const VALUE_CHANGED:String = "value_changed";
private var variable:String;
public function Model() :void
{
}
public function setVariable(newVar:String):void
{
variable = newVar;
this.dispatchEvent(new Event(Model.VALUE_CHANGED));
}
public function getVariable():String {
return variable;
}
}
答案 0 :(得分:0)
在读取utf字节时使用“content.bytesAvailable”。
答案 1 :(得分:0)
那里你有一个错误:
_model.addEventListener(Model.VALUE_CHANGED, fileLoaded);
// ...
fr.addEventListener(Event.COMPLETE, fileLoaded);
请注意,两个事件都会触发相同的处理程序 这显然不是你想要的。
顺便说一句,在新加载的readUTFBytes()
上调用ByteArray
是好的(因为位置最初为零),通常在阅读之前设置position
是好的。只是为了保持清醒。
var content:ByteArray = fr.data;
content.position = 0;
_model.setVariable(content.readUTFBytes(content.length));
更正了您的代码版本:
package
{
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.net.FileFilter;
import flash.net.FileReference;
import flash.utils.ByteArray;
[SWF(width="800", height="600")]
public class Main extends Sprite
{
public var fr:FileReference;
private var _model:Model;
private var button:Sprite;
public function Main():void
{
_model = new Model();
_model.addEventListener(Model.VALUE_CHANGED, valueChanged);
stage.addEventListener(MouseEvent.MOUSE_DOWN, loadClicked);
trace(_model.getVariable());
}
protected function valueChanged(event:Event):void
{
trace(_model.getVariable());
}
protected function loadClicked(e:Event):void
{
fr = new FileReference();
fr.addEventListener(Event.SELECT, fileSelected);
fr.browse([new FileFilter("JSON Files (*.json)", "*.json")]);
}
public function fileSelected(event:Event):void
{
trace(event.type);
fr.addEventListener(Event.COMPLETE, fileLoaded);
fr.load();
}
public function fileLoaded(event:Event):void
{
trace(event.type);
try
{
var content:ByteArray = fr.data;
content.position = 0;
_model.setVariable(content.readUTFBytes(content.length));
} catch (e:Error) {
trace("Error");
}
}
}
}