使用一个文件流保存2种数据?

时间:2015-06-05 12:57:13

标签: actionscript-3 save filestream

我保存了2种数据(文字和图像)。是否可以使用1个文件流同时保存2种类型的数据?示例

var myTextFileObj:Object = new Object()
myTextFileObj["Name"]="George Borming" 
var imgByteData:ByteArray = jpgEncoder.encode(myBitmapData);//lets assume i have a bitmap data here

var folder:File = File.documentsDirectory.resolvePath("myApp/images/image.jpg");
var folder2:File = File.documentsDirectory.resolvePath("myApp/textfiles/mytext.txt");

fileStream = new FileStream();  
fileStream.addEventListener(Event.CLOSE, saveImg_FS_fileClosed);
fileStream.addEventListener(Event.COMPLETE, saveImg_FS_completeHandler); 
fileStream.addEventListener(ProgressEvent.PROGRESS, saveImg_FS_progressHandler); 
fileStream.addEventListener(IOErrorEvent.IO_ERROR, saveImg_FS_errorHandler); 

fileStream.openAsync(folder, FileMode.UPDATE);  
fileStream.writeBytes(imgByteData)

fileStream.openAsync(folder2, FileMode.UPDATE);  
fileStream.writeObject(myTextFileObj);
fileStream.close();

这是否有效?如果我只创建2个文件流并单独保存数据,是否可能或者更好?如果可能而且我的代码有误,请告诉我正确的代码。

1 个答案:

答案 0 :(得分:0)

这当然是可能的。可能的问题是,您正在使用openAsync,因此当您尝试打开另一个文件并且在打开第二个文件之前没有关闭第一个文件时,文件流操作仍在进行中。

您需要等到第一个操作完成才能开始第二个操作<或> 同步打开文件,而不是open而不是{{1} }。

例如:

openAsync

如果您的两个文件总是一起打开/保存,您可能会发现使用自定义类/模型来保存要清洁的项目更清晰,然后使用var folder:File = File.documentsDirectory.resolvePath("myApp/images/image.jpg"); fileStream = new FileStream(); fileStream.addEventListener(Event.CLOSE, saveImg_FS_fileClosed); fileStream.addEventListener(Event.COMPLETE, saveImg_FS_completeHandler); fileStream.addEventListener(ProgressEvent.PROGRESS, saveImg_FS_progressHandler); fileStream.addEventListener(IOErrorEvent.IO_ERROR, saveImg_FS_errorHandler); fileStream.open(folder, FileMode.UPDATE); //use open instead of open Async fileStream.writeBytes(imgByteData) fileStream.close(); //close the current File so you can open a new one folder = File.documentsDirectory.resolvePath("myApp/textfiles/mytext.txt"); fileStream.open(folder, FileMode.UPDATE); fileStream.writeObject(myTextFileObj); fileStream.close(); 将该类序列化为一个文件。

这样的事情:

FileStream.writeObject

然后,你可以这样做:(在你的构造函数或任何地方)

package {
    import flash.utils.ByteArray;

    public class SaveData {
        public var textFile:Object;
        public var imageByteData:ByteArray;
        //any other properties
    }
}

然后将其保存到文件中,您可以按照以下方式执行操作:

flash.net.registerClassAlias("SaveData",SaveData);
flash.net.registerClassAlias("flash.utils.ByteArray",ByteArray);
//you have to register every non primitive class referenced by SaveData (including nested classes)
var myTextFileObj:Object = new Object()
myTextFileObj["Name"]="George Borming";

var mySaveData:SaveData = new SaveData();
mySaveData.textFile = myTextFileObj;
mySaveData.imageByteData = jpgEncoder.encode(myBitmapData);//lets assume i have a bitmap data here

var folder:File = File.documentsDirectory.resolvePath("myApp/mySaveData.data");

fileStream = new FileStream();  
fileStream.addEventListener(Event.CLOSE, saveImg_FS_fileClosed);
fileStream.addEventListener(Event.COMPLETE, saveImg_FS_completeHandler); 
fileStream.addEventListener(ProgressEvent.PROGRESS, saveImg_FS_progressHandler); 
fileStream.addEventListener(IOErrorEvent.IO_ERROR, saveImg_FS_errorHandler); 

fileStream.openAsync(folder, FileMode.WRITE);  

//serialize it to the file with writeObject
fileStream.writeObject(mySaveData);
fileStream.close();

这样,你可以在1个文件中拥有任意数量的对象。