关于fs.readFile方法的问题,求解。
发布于 1年前 作者 lcjnil 655 次浏览

RT 我在看书《Node现学现用》里面,第68页出现了这样的一句话

最基本的流如例 4-16 所示,它从一个文件里把数据分块读取。每当一个新的数据块准备好的时候,它会把数据以变量 data 的形式传给回调函数。

例 4-16是这样的

var fs = require('fs');
var filehandle = fs.readFile('data.txt', function(err, data) {
 console.log(data);
})

但我很怀疑这句话的真实性 它从一个文件里把数据分块读取。每当一个新的数据块准备好的时候,它会把数据以变量 data 的形式传给回调函数。 所以我进行了如下测试

var fs = require('fs');
var i = 0;
fs.readFile('k.rar', function(err, data) {
 console.log(++i)
 //console.log(data);
})

这里的文件是一个900MB+的文件,但是最后console还是只输出了1,虽然在输出前等待了数秒。

所以我想问的是,这里的数据(data变量)是一块一块传过来的,还是等整个文件读完再全部调用回来。 谢谢

7 回复

不分块吧? 不知道

readfile是一次性读取到内存,大文件建议走readstream 看fs.createReadStream 接口

suqian的解答是正确的, 如果使用stream的会会分块返回数据

也就是说,在这里readFile是一次性读取到data,调用回调。 然后使用流,才是分段读取的,直到end事件? 谢谢,了解了,感谢楼上各位

node的文档已经说了,异步读取一个文件的全部内容。

看来读大文件不能用fs.readFile 或 fs.readFileSync, 会把等待的别的程序憋死的。

你说的有道理,不过可以通过自己创建ReadStream,在数据到达时就立即处理,这样就不会等到所有数据都读完后处理。 不过,fs.readFile也不会有什么问题,因为开始读的时候,这个操作是交给操作系统了,而node线程可以处理其它请求,当读完的时候才会调用回调,也不会有什么 不好的影响。。不过据我所知,fs.readFile方法内部应该使用buffer,而这个好像最大可以支持1g的字节,所以,估计1g以上的文件,这个方法可能会有问题。

回到顶部