SMLNJ中TextIO.input与TextIO.inputAll的区别及相关疑问
SMLNJ中TextIO.input与TextIO.inputAll的区别解析
我使用SMLNJ编写程序,需求是打开一个txt文件并将其中的每个字符生成一个列表。最初编写的代码如下:
val charlist = explode(TextIO.input(TextIO.openIn "myfile.txt"))
但在某一特定测试用例(并非最大的测试用例)中,程序读取部分字符后就停止了解析。将TextIO.input替换为TextIO.inputAll后,程序恢复正常运行。我查阅了相关文档:
[input istr] 从istr中读取部分元素,返回包含这些元素的向量v。当且仅当istr处于流末尾或已关闭时,向量为空(size v = 0)。可能阻塞(直至外部世界有可用数据才返回)。
[inputAll istr] 读取并返回istr中直至流末尾的所有剩余字符组成的字符串v。
但仍对两者的区别存有疑惑:
- TextIO.input读取元素数量的判定标准是什么?
- “可能阻塞(直至外部世界有可用数据才返回)”这句话具体是什么意思?
关于TextIO.input的读取数量判定
TextIO.input的读取数量没有固定阈值,它由底层IO实现和当前流的状态决定:
- 针对文件流,它通常会读取当前操作系统缓冲区中可用的一批数据,大小可能是4KB、8KB这类常见的文件系统块大小。如果目标文件的内容刚好被分割在缓冲区边界,就会出现只读取部分内容的情况——这正是你遇到的问题:该测试用例的文件内容在某次缓冲区读取后仍有剩余,但
input仅返回了当前缓冲区的内容,不会自动继续读取剩余部分。 - 它的设计定位是分批次读取,适合处理大文件或流式数据(如网络流、标准输入),允许程序边读取边处理,避免一次性加载全部数据占用过多内存。
关于“可能阻塞”的含义
这句话主要针对非文件类的流场景:
- 比如从标准输入读取时,若用户还未输入内容;或从网络套接字流读取时,远端还未传输数据,
TextIO.input会暂停当前程序的执行,直到有数据可用才会返回读取结果。 - 对于文件流来说,因为内容已预先存在,一般不会触发阻塞,但如果文件被其他进程锁定、正在被写入,也可能出现阻塞等待的情况。
内容的提问来源于stack exchange,提问作者lil_papa
相关产品推荐
相关产品推荐

