【问题标题】:FileStream.truncate() doesn't work after calling FileStream.readUTFBytes() (Adobe AIR)调用 FileStream.readUTFBytes() (Adobe AIR) 后 FileStream.truncate() 不起作用
【发布时间】:2009-04-21 22:02:40
【问题描述】:

我正在尝试将一个 xml 文件读入内存,添加一个节点,然后覆盖原始文件。

以下代码可以正常工作(它会清除文件,然后将新字节写入顶部):

var stream:FileStream = new FileStream();
stream.open(file, FileMode.UPDATE);
stream.position = 0;
stream.truncate();
stream.writeUTFBytes("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
stream.writeUTFBytes(File.lineEnding);
stream.writeUTFBytes(xml.toXMLString());
stream.close();

但是,如果我在文件打开后尝试执行读取,则位置/截断调用不起作用:

var stream:FileStream = new FileStream();
stream.open(file, FileMode.UPDATE);

var xml:XML = XML(stream.readUTFBytes(stream.bytesAvailable));

// Modify xml here

stream.position = 0;
stream.truncate();
stream.writeUTFBytes("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
stream.writeUTFBytes(File.lineEnding);
stream.writeUTFBytes(xml.toXMLString());
stream.close();

有没有人知道为什么这不起作用?

如果您检查流,在第一个代码中,在调用 truncate() 之后,bytesAvailable 属性将读取 0。但在第二个代码中,bytesAvailable 不会改变(它将显示当前文件大小) .

【问题讨论】:

    标签: xml apache-flex adobe air filestream


    【解决方案1】:

    在 truncate() 之后关闭流,然后再次打开它。或者改用 openAsync 。

    stream.position = 0;
    stream.truncate();
    stream.close();
    stream.open(file, FileMode.UPDATE);
    stream.writeUTFBytes("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
    stream.writeUTFBytes(File.lineEnding);
    stream.writeUTFBytes(xml.toXMLString());
    stream.close();
    

    var stream:FileStream = new FileStream();
    stream.openAsync(file, FileMode.UPDATE);
    stream.position = 0;
    stream.truncate();
    stream.writeUTFBytes("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
    stream.writeUTFBytes(File.lineEnding);
    stream.writeUTFBytes(xml.toXMLString());
    stream.close();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-06
      • 2016-08-07
      • 1970-01-01
      • 2017-09-23
      • 1970-01-01
      • 2013-06-12
      相关资源
      最近更新 更多