持久化数据,是每一个私服开发者必须会的,前面已经说了lua 表数据与字符串互转,那么本篇文章就可以通过此来实现数据的持久化!

第一步: 打开文件

file = io.open (filename,mode)

- filename代表的是文件名
- mode 代表的模式
mode值描述
r以只读方式打开文件,该文件必须存在。
w打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
a以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留)
r+以可读写方式打开文件,该文件必须存在。
w+打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
a+与a类似,但此文件可读可写
b二进制模式,如果文件是二进制文件,可以加上b
+号表示对文件既可以读也可以写

第二步: 读取文件

-- 系统提供的方法IO.xxx
file = io.open("d://nihao.txt","r")

-- 声明接下来的io操作对象都是file
io.input(file)
print(io.read()) --读取一行
print(io.read()) --读取第二行 如果第二行没有就会输出 nil

-- 关闭操作文件对象
io.close(file)

读取完毕,如果不写入的话,需要关闭文件

-- 关闭打开的文件
file:close() 这里等价于 io.close(file)

第三步: 写文件

-- 获取写入对象 file1 并指定mode为 保留原文件内容的写
file = io.open("d://nihao.txt","a")

-- 获取输出流对象,写文件必须有这个对象
io.output(file1)

-- 正常的写入操作
io.write("www.baidu.com")
io.write("\n") -- 换行

-- io.flush()

-- 关闭文件
io.close(file1)

其他案例

-- 读取文件  
    local f = assert(io.open(fileName,'r')) -- 这里假如断言读取文件,没有发现特别的点
    local content = f:read('*all')
    f:close()


-- 写文件
    local f = assert(io.open(fileName,'w'))
    f:write(content)
    f:close()

真实环境操作

我制作NPC路径的时候 不停的!pos 这个感觉非常的难受,于是就萌生了,执行!pos后,会将位置信息,记录在文件中,这样我就可以一次性复制出完整的NPC路径了!非常的银杏!

--读取一个文件
local myfile = io.open("NpcRoute.txt","a")

-- 如果打印nil 代表文件不存在
if myfile == nil then
	print("原文件是不存在,如果后续执行写入文件,将会创建此文件!") 
else
	print("原文件存在,无需创建新文件!") 
end

-- 获取当前文件输出流
io.output(myfile) 

-- 写一个Hello World 并换行
io.write("x ,y ,z ,\n")  -- 调用IO去写,这里不清楚如果读取多个文件是否会导致io对象代表谁?

--myfile:write("x ,y ,z ,\n") -- 这里是指定对象写入 调用write是: 不是. 与上面记录x,y,z 等价

-- 向文件写入缓冲中的所有数据,暂时没发现什么用,可有可无
io.flush()

-- 关闭打开的文件
io.close(myfile)

print("本次IO操作完成")

执行2次结果如下:

完成!

发表评论

您的电子邮箱地址不会被公开。