Node.js文件系统的read()内的指针移动

本文探讨了在Node.js 8.9.1中使用fs.read()函数时,关于POSITION参数如何影响文件读取指针的问题。官方文档表明,当POSITION为null时,读取应从当前位置开始并更新位置。然而,在实际应用中,当连续调用两次fs.read(),并将第二个的POSITION设为null时,读取并未按照预期从上次结束位置继续。这引发了关于读取指针是否在第一次调用后移动的疑问。通过实验代码验证,发现指针可能并未在第一次调用后改变,提示可能存在未被充分理解的行为或文档解释的不清晰。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我利用的是Node.js8.9.1,对于fs.read()函数的POSITION这个API,官方中文描述如下:

fs.read(fd, buffer, offset, length, position, callback)

对于函数的position参数,描述如下:

position 指定从文件中开始读取的位置。 如果 position 为 null,则数据从当前文件读取位置开始读取,且文件读取位置会被更新。 如果 position 为一个整数,则文件读取位置保持不变。

从上面可以看出,当position设置为null,则数据会从接着读取,所以我当初想当然的认为一个read()函数运行完毕后,在进行一次这个函数,读取操作会接着上一次进行,简化版程序如下:

var fs=require('fs');
fs.open('./message.txt','r',function (err,fd) {//打开文件
    var buf = new Buffer(255);
    fs.read(fd, buf, 0, 6, 0, function (err, bytesRead, buffer) {//第一次读取到第二个字(文件以utf8格式存储,一个字3字节)
        console.log(buffer.slice(0, bytesRead).toString());//输出“我喜”
        fs.read(fd, buf, 0, 6, null, function (err, bytesRead, buffer) {//第二次读取,紧接着指针原有位置读取,同样读两个字
            console.log(buffer.slice(0, bytesRead).toString());//输出“我喜”
        });
    });
});
此程序修改自《Node.js权威指南》的代码清单6-11,其中message.txt的内容为“我喜爱编程”。

本来认为其运行结果应该是

“我喜

爱编”

为什么当第二个read()语句的POSITION设置为null时,没有按照官方文档所说一样, 让指针接着上一次读取的位置接着读下去呢?

我认为官方文档出错的概率是很低的,应该假定其是完全正确的,所以认为第二个read()进行时,指针还在文档的position=0的位置,所以,第一个read()运行后,指针并未移动?为了验证这个想法,我把第一个read()函数修改为:

 fs.read(fd, buf, 0, 6, null, function (err, bytesRead, buffer)//将一开始的读取位置设置为null,读取完毕后指针停留在第二个字后;
此时运行结果为:

“我喜

爱编”

所以这证明了,当position!=null时,读取文件的指针是不会变化的,当将其设置为null时,指针才会不断随着读取移动。

为了加深这个理解,请观察以下程序:

var fs=require('fs');
fs.open('E:/Node.js/message.txt','r',function (err,fd) {
    var buf = new Buffer(255);
    fs.read(fd, buf, 0, 6, null, function (err, bytesRead, buffer) {//读取位置设置为null,读取完毕后指针停留在第二个字后;
        console.log(buffer.slice(0, bytesRead).toString());//"我喜"
        fs.read(fd, buf, 0, 6, 0, function (err, bytesRead, buffer) {//直接读取前两个字,读取完毕后指针未变化
            console.log(buffer.slice(0, bytesRead).toString());//“我喜”
            fs.read(fd, buf, 0, 6, null, function (err, bytesRead, buffer) {
		//读取位置设置为null,此时指针在第二个字后,所以此时读取从第三个字开始
                console.log(buffer.slice(0, bytesRead).toString());//"爱编"
            });
        });
    });
});
如有不足,请各位批评指正!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值