我保存了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个文件流并单独保存数据,是否可能或者更好?如果可能而且我的代码有误,请告诉我正确的代码。
答案 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个文件中拥有任意数量的对象。