Lua使用相同的底层C实现模型管理文件(此模型也被其他编程语言使用,这是相当常见的).如果您不熟悉这种查看文件的方式,那么术语可能不清楚.

在该模型中,文件表示为具有所谓的当前位置的字节流.当前位置是一种指向文件中第一个字节的概念指针,该字节将由下一个I / O操作读取或写入.当您打开文件进行读取时,会设置一个新流,使其当前位置是文件的开头,即当前位置“指向”文件中的第一个字节.

在Lua中,您通过所谓的文件句柄管理流,这些句柄是底层流的一种中介.使用句柄执行的任何操作都将转移到相应的流.

Lua io.open打开一个文件,将C流与它关联,并返回一个表示该流的文件句柄:

local file_handle = io.open( "myfile.txt" ) -- file opened for reading

因此,如果执行任何读取某些字节的操作(通常解释为字符,如果使用文本文件),则从流中读取这些字节,并且对于每个字节读取,流的当前位置前进1,每次指向下一个要读取的字节.

Lua文档暗示了这个模型.因此,当它表示下一行时,表示输入操作将读取流中从当前位置开始直到找到行尾字符的所有字符.

请注意,如果您将文本文件视为一系列行,则可能会被误导,因为您可以想到“当前行”和“下一行”.与C模型相比,这将是更高级别的模型. C中没有“当前行”.在C文本文件中只有一个字节序列,其中一些特殊字符(行尾字符)经过一些特殊处理(主要依赖于实现)并由某些C标准函数作为行终止符,即作为标记来检测何时停止读取字符.

新手或来自高级语言的人混淆的另一个原因是,在C中,对于历史事故,字节被处理为字符(处理单个字节的基本数据类型是char,这是C中最小的数字类型!) .因此,对于具有C背景的人来说,将字节视为字符是很自然的,反之亦然.

尽管Lua是一种比C语言更高级的语言,但它与C的密切关系(它被设计为易于与C代码接口)使得它继承了这种C“字节作为字符”方法的一部分.实际上,例如,Lua字符串可以保存任意字节,并可用于处理原始二进制数据.