FileStream.truncate() не работает после вызова FileStream.readUTFBytes() (Adobe AIR)

Я пытаюсь прочитать файл 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();

Однако, если я попытаюсь выполнить чтение после открытия файла, вызовы position/truncate не работают:

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 не изменится (оно покажет текущий размер файла).


person Mark Ingram    schedule 21.04.2009    source источник


Ответы (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();

OR

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();
person Community    schedule 29.09.2009