Cocos Creator如何讀寫本地文件
前言
一、使用localStorage存儲和讀取本地文件
1. 常用API
存儲:cc.sys.localStorage.setItem(key, value);
兩個參數(shù),用來索引的字符串鍵值 key,和要保存的字符串數(shù)據(jù) value。
讀?。?/strong>cc.sys.localStorage.getItem(key);
一個參數(shù),只需要根據(jù)key來讀取相應的值。
刪除:cc.sys.localStorage.removeItem(key);
移除一個存儲的值后,無法再讀取。
這種處理方式,類似Java中的Map。
2. 簡單案例
cc.sys.localStorage.setItem(key, value)
上面的方法需要兩個參數(shù),用來索引的字符串鍵值 key,和要保存的字符串數(shù)據(jù) value。
假如我們要保存玩家持有的金錢數(shù),假設鍵值為 gold:
cc.sys.localStorage.setItem('gold', 100);
對于復雜的對象數(shù)據(jù),我們可以通過將對象序列化為 JSON 后保存:
userData = {
? ?name: 'Tracer',
? ?level: 1,
? ?gold: 100
};
cc.sys.localStorage.setItem('userData', JSON.stringify(userData));
和 setItem 相對應,getItem 方法只要一個鍵值參數(shù)就可以取出我們之前保存的值了。對于上文中儲存的用戶數(shù)據(jù):
var userData = JSON.parse(cc.sys.localStorage.getItem('userData'));
3.數(shù)據(jù)加密
對于單機游戲來說,對玩家存檔進行加密可以延緩游戲被破解的時間。要加密存儲數(shù)據(jù),只要在將數(shù)據(jù)通過JSON.stringify 轉化為字符串后調用你選中的加密算法進行處理,再將加密結果傳入 setItem 接口即可。
您可以搜索并選擇一個適用的加密算法和第三方庫,比如 encryptjs, 將下載好的庫文件放入你的項目,存儲時:
var encrypt=require('encryptjs');
var secretkey= 'open_sesame'; // 加密密鑰
var dataString = JSON.stringify(userData);
var encrypted = encrypt.encrypt(dataString,secretkey,256);
cc.sys.localStorage.setItem('userData', encrypted);
讀取時:
var cipherText = cc.sys.localStorage.getItem('userData');
var userData=JSON.parse(encrypt.decrypt(cipherText,secretkey,256));
注意 數(shù)據(jù)加密不能保證對用戶檔案的完全掌控,如果您需要確保游戲存檔不被破解,請使用服務器進行數(shù)據(jù)存取。
二、使用jsb.fileUtils
1.常用API
jsb是javascript bind的代表,整個C/C++ 導出的綁定都在這個jsb里面,jsb 支持native,不支持h5(瀏覽器上無法運行jsb is not defined )。而且fileUtils是本地文件讀寫的一個工具類,全局只有一個實例。

2.簡單案例
cc.Class({
? ?extends: cc.Component,
? ?onLoad() {
? ? ? ?// jsb.fileUtils獲取全局的工具類的實例, cc.director;
? ? ? ?// 如果是在電腦的模擬器上,就會是安裝路徑下模擬器的位置;
? ? ? ?// 如果是手機上,那么就是手機OS為這個APP分配的可以讀寫的路徑;
? ? ? ?// jsb --> javascript binding --> jsb是不支持h5的
? ? ? ?var writeable_path = jsb.fileUtils.getWritablePath();
? ? ? ?console.log(writeable_path);
?
? ? ? ?// 要在可寫的路徑先創(chuàng)建一個文件夾
? ? ? ?var new_dir = writeable_path + "new_dir";
? ? ? ?// 路徑也可以是 外部存儲的路徑,只要你有可寫外部存儲的權限;
? ? ? ?// getWritablePath這個路徑下,會隨著我們的程序卸載而刪除,外部存儲除非你自己刪除,否者的話,卸載APP數(shù)據(jù)還在;
? ? ? ?if(!jsb.fileUtils.isDirectoryExist(new_dir)) {
? ? ? ? ? ?jsb.fileUtils.createDirectory(new_dir);
? ? ? ?} else {
? ? ? ? ? ?console.log("dir is exist!!!");
? ? ? ?}
? ? ? ?
? ? ? ?// 讀寫文件我們分兩種,文本文件, 二進制文件;
? ? ? ?// (1)文本文件的讀,返回的是一個string對象
? ? ? ?var str_data = jsb.fileUtils.getStringFromFile(new_dir + "/test_str_read.txt");
? ? ? ?console.log(str_data);
? ? ? ?str_data = "hello test_write !!!!!"
? ? ? ?jsb.fileUtils.writeStringToFile(str_data, new_dir + "/test_str_write.txt");
? ? ? ?// (2)二進制文件的讀寫, Uint8Array --> js對象
? ? ? ?var bin_array = jsb.fileUtils.getDataFromFile(new_dir + "/test_bin_read.png");
? ? ? ?console.log(bin_array[0], bin_array[1]); // 使用這個就能訪問二進制的每一個字節(jié)數(shù)據(jù);
? ? ? ?jsb.fileUtils.writeDataToFile(bin_array, new_dir + "/test_bin_write.png");
? ? ? ?// end
? ? ? ?// 刪除文件和文件夾
? ? ? ?// jsb.fileUtils.removeFile(new_dir + "/test_bin_write.png");
? ? ? ?// jsb.fileUtils.removeDirectory(new_dir);
? ?},
});
三、瀏覽器環(huán)境下寫文件
由于CocosCreator官方文檔中沒有提供跨平臺的通用寫文件接口。如果運行環(huán)境是瀏覽器,有一個替代方案可以實現(xiàn)把內(nèi)容保存到文件,效果相當于下載了一個文件到本地。代碼如下:
// 保存字符串內(nèi)容到文件。
// 效果相當于從瀏覽器下載了一個文件到本地。
// textToWrite - 要保存的文件內(nèi)容
// fileNameToSaveAs - 要保存的文件名
saveForBrowser(textToWrite, fileNameToSaveAs) {
? ?if (cc.sys.isBrowser) {
? ? ? ?console.log("瀏覽器");
? ? ? ?let textFileAsBlob = new Blob([textToWrite], {type:'application/json'});
? ? ? ?let downloadLink = document.createElement("a");
? ? ? ?downloadLink.download = fileNameToSaveAs;
? ? ? ?downloadLink.innerHTML = "Download File";
? ? ? ?if (window.webkitURL != null){
? ? ? ? ? ?// Chrome allows the link to be clicked
? ? ? ? ? ?// without actually adding it to the DOM.
? ? ? ? ? ?downloadLink.href = window.webkitURL.createObjectURL(textFileAsBlob);
? ? ? ?}else{
? ? ? ? ? ?// Firefox requires the link to be added to the DOM
? ? ? ? ? ?// before it can be clicked.
? ? ? ? ? ?downloadLink.href = window.URL.createObjectURL(textFileAsBlob);
? ? ? ? ? ?downloadLink.onclick = destroyClickedElement;
? ? ? ? ? ?downloadLink.style.display = "none";
? ? ? ? ? ?document.body.appendChild(downloadLink);
? ? ? ?}
? ? ? ?downloadLink.click();
? ?}
}
四、Cocos Creator 讀寫本地的json文件
關于Cocos Creator讀寫本地json文件,我們單獨給大家寫一篇文章專門做介紹!