首页 > 代码库 > chapter11_3 字符串缓冲
chapter11_3 字符串缓冲
逐行地读取一个文件,典型的代码是:
local buff= " "for line in io.lines() do buff = buff .. line .. "\n"end
这段代码看似可以正常工作,但是如果面对较大的文件时,性能开销极大。
Lua提供了io.read("*a")选项,这样可以一次性读取整个文件。
在Lua中,可以将一个table作为字符串缓冲。关键是使用函数table.concat,它将给定列表中的所有字符串连接起来,并返回结果。
用concat来重写上述循环:
local t = {}for line in io.lines() do t[#t + 1] = line .. "\n"endlocal s = table.concat(t)
之前的代码处理350k的文件需要1分钟,而这个实现只需花小于0.5秒的时间。
concat函数还有第二个可选的参数,可以指定一个插在字符串间的分隔符,有了这个分隔符,就不必在每行后插入一个“\n”了。
local t = {}for line in io.lines() do t[#t + 1] = lineends = table.concat(t,"\n") .. "\n" --需要在最后的结尾添加一个"\n"
上面的最后一行需要复制整个结果字符串,而这时的字符串也已经相当长了。
没有直接的选项让concat插入这个额外的分隔符,不过可以“欺骗”concat,只需要在t后面添加一个空字符串:
local t = {}for line in io.lines() do t[#t + 1] = lineendt[#t + 1] = "" --用空字符串 欺骗concats = table.concat(t,"\n")
concat在空字符串前插入了这个额外的换行符,位于结果字符串的末尾。
chapter11_3 字符串缓冲
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。