0

我正在尝试将 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 不会改变(它将显示当前文件大小)。

4

1 回答 1

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();
于 2009-09-29T18:12:01.500 回答