用lua格式做配置文件或记录文件,代码如下: --[[lua配置处理类读写lua格式配置文件Load 读取lua配置文件Save 写入lua配置文件GetConfig 获取当前缓存的配置--]]local LuaConfig = class("LuaConfig")L
用lua格式做配置文件或记录文件,代码如下:
--[[ lua配置处理类 读写lua格式配置文件 Load 读取lua配置文件 Save 写入lua配置文件 GetConfig 获取当前缓存的配置 --]] local LuaConfig = class("LuaConfig") LuaConfig._instance = nil -- 各种参数 LuaConfig._config = nil LuaConfig._defFilePath = cc.FileUtils:getInstance():getWritablePath().."config.lua" LuaConfig._formatString = "" function LuaConfig:GetInstance() if LuaConfig._instance == nil then LuaConfig._instance = LuaConfig.new() end return LuaConfig._instance end function LuaConfig:ReleaseInstance() if LuaConfig._instance ~= nil then LuaConfig._instance:Release() LuaConfig._instance = nil end end function LuaConfig:ctor() end -- 设置格式化输出缩进 function LuaConfig:SetFormatString(formatString) self._formatString = formatString end -- 序列化 准备存储 返回序列化后的字符串 缩进暂时为1空格 参数为nil时 处理_config function LuaConfig:Serialize(config, formatString) if config == nil then -- nil不处理 return "nil" end local serializedConfig = "" local formatString = formatString or self._formatString local tableFormatString = string.gsub(formatString, self._formatString, "", 1) -- table去掉一个缩进 -- 序列化操作 number boolean string table local paramType = type(config) if paramType == "number" then serializedConfig = serializedConfig..tostring(config) elseif paramType == "boolean" then serializedConfig = serializedConfig..tostring(config) elseif paramType == "string" then serializedConfig = serializedConfig..string.format("%q", config) -- 接受一个字符串并将其转化为可安全被Lua编译器读入的格式 主要防止使用if或其他关键字之类的作为key的情况 elseif paramType == "table" then serializedConfig = serializedConfig.."\n" serializedConfig = serializedConfig..tableFormatString.."{\n" for k,v in pairs(config) do serializedConfig = serializedConfig..formatString serializedConfig = serializedConfig.."["..self:Serialize(k).."]" serializedConfig = serializedConfig.." = " serializedConfig = serializedConfig..self:Serialize(v, formatString..self._formatString) serializedConfig = serializedConfig..",\n" end serializedConfig = serializedConfig..tableFormatString.."}" else print("can not handle this type:"..paramType) end return serializedConfig end -- 获取当前配置 function LuaConfig:GetConfig() return self._config end -- 读取配置 同时返回读取到的配置 方便外部操作 function LuaConfig:Load(path) if path == nil then path = self._defFilePath end local content = self:ReadFromFile(path) if content ~= nil then self._config = loadstring("return "..content)() -- loadstring载入后默认为function类型,需要加()以调用 end return self._config end -- 保存配置 参数为nil时 处理_config function LuaConfig:Save(path, config) -- 默认处理_config if config == nil then config = self._config end if path = nil then path = self._defFilePath end local isSuccess = false -- 设置缩进 self:SetFormatString(" ") -- 序列化 local serializedConfig = self:Serialize(config) if serializedConfig ~= nil then -- 存储到文件 isSuccess = self:SaveToFile(serializedConfig, path) end return isSuccess end -- 存储 function LuaConfig:SaveToFile(content, path) local isSuccess = false local file = io.open(path, "w") if file ~= nil then file:wirte(content) file:flush() isSuccess = true end io.close() -- 同file:close() 参数可传file,或默认关闭当前打开的 return isSuccess end -- 读取 function LuaConfig:ReadFromFile(path) local content = nil --[[ 调用lua本身接口 可能有文件大小限制 据说是最大9K 未验证 local file = io.open(path, "r") if file ~= nil then content = file:read("*a") -- 读取所有内容 end io.close() -- 同file:close() 参数可传file,或默认关闭当前打开的 --]] ---[[ 调用cocos相关接口 content = cc.FileUtils:getInstance():getStringFromFile(path) --]] return content end return LuaConfig主要是其中的序列化部分,其他都比较容易理解。