save 2 kinds of data using one filestream?

天大地大妈咪最大 提交于 2019-12-08 10:32:15

问题


Im saving 2 kinds of data(text and image). Is it possible to save 2 types of data at the same time using 1 filestream? example

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();

Will this work?Is it possible or would it be better if i would just create 2 filestream and save the datas seperately. IF it is possible and my code is wrong, please can you teach me the right codes.


回答1:


It's certainly possible. The likely issue though, is that you are using openAsync, so the file stream operation is still in progress when you try open another file and you don't close the first file before opening the second.

You either you need to wait until the first operation completes before starting the second, or open the files synchronously using open instead of openAsync.

FOR EXAMPLE:

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();

If your two files are always opened / saved together, you may find it cleaner to use a custom class/model for the items you want to save, then use FileStream.writeObject to serialize that class to just one file.

Something like this:

package {
    import flash.utils.ByteArray;

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

Then, you can do this: (in your constructor or wherever)

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)

Then to save it to file, you do something along these lines:

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();

//then later when you want to read it back in
var mySaveData:SaveData = fileStream.readObject();
trace(mySaveData.textFile["Name"]); //George Borming

This way you can have as many objects as you want in 1 file.



来源:https://stackoverflow.com/questions/30667151/save-2-kinds-of-data-using-one-filestream

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!