Search code examples
actionscript-3savefilestream

save 2 kinds of data using one filestream?


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.


Solution

  • 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.