0

我使用 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;
    }
}
4

2 回答 2

0

读取 utf 字节时使用“content.bytesAvailable”。

于 2012-05-19T10:35:37.140 回答
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");
            }
        }
    }
}
于 2012-05-19T10:39:46.683 回答