chapter11_3 字符串缓冲

Posted daiker

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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"
end
local s = table.concat(t)

之前的代码处理350k的文件需要1分钟,而这个实现只需花小于0.5秒的时间。

concat函数还有第二个可选的参数,可以指定一个插在字符串间的分隔符,有了这个分隔符,就不必在每行后插入一个“\n”了。

local t = {}
for line in io.lines() do
    t[#t + 1] = line
end
s = table.concat(t,"\n") .. "\n"  --需要在最后的结尾添加一个"\n"

上面的最后一行需要复制整个结果字符串,而这时的字符串也已经相当长了。

没有直接的选项让concat插入这个额外的分隔符,不过可以“欺骗”concat,只需要在t后面添加一个空字符串:

local t = {}
for line in io.lines() do
    t[#t + 1] = line
end
t[#t + 1] = ""        --用空字符串 欺骗concat
s = table.concat(t,"\n")

concat在空字符串前插入了这个额外的换行符,位于结果字符串的末尾。

以上是关于chapter11_3 字符串缓冲的主要内容,如果未能解决你的问题,请参考以下文章

java缓冲字符字节输入输出流:java.io.BufferedReaderjava.io.BufferedWriterjava.io.BufferedInputStreamjava.io.(代码片段

Chapter 21_3 模式

深入理解计算机系统_3e 第十一章家庭作业 CS:APP3e chapter 11 homework

Thinking in java Chapter18 IO

nowcoder basic algorithm chapter 3

第3章 缓冲流介绍和使用