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

来源:互联网 发布:阿里云存储服务 个人 编辑:程序博客网 时间:2024/05/18 12:35

我利用的是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());//"爱编"            });        });    });});
如有不足,请各位批评指正!

原创粉丝点击