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