在node.js中一次读取一个文件的文件?

有没有办法从文件中一次读取nodejs中的一个符号,而不将整个文件存储在内存中? 我find了线的答案

我尝试了这样的事情,但没有帮助:

stream = fs.createReadStream("walmart.dump", { encoding: 'utf8', fd: null, bufferSize: 1, }); stream.on('data', function(sym){ console.log(sym); }); 

可读stream有一个read()方法,您可以在其中传递大小相同的符号。 示例代码:

 var readable = fs.createReadStream("walmart.dump", { encoding: 'utf8', fd: null, }); readable.on('readable', function() { var chunk; while (null !== (chunk = readable.read(1))) { console.log(chunk); // chunk is one symbol } }); 

这是一个较低级别的方法: fs.read(fd,buffer,offset,length,position,callback)

使用:

 const fs = require('fs'); // open file for reading, returns file descriptor const fd = fs.openSync('your-file.txt','r'); function readOneCharFromFile(position, cb){ // only need to store one byte (one character) const b = new Buffer(1); fs.read(fd, b, 0, 1, position, function(err,bytesRead, buffer){ console.log('data => ', String(buffer)); cb(err,buffer); }); } 

当你阅读文件时,你将不得不增加位置,但它会起作用。

下面是一个简单的例子,说明如何按字符读取整个文件

为了好玩,我写了这个完整的脚本来完成它,只是传入不同的文件path,它应该工作

 const async = require('async'); const fs = require('fs'); const path = require('path'); function read(fd, position, cb) { let isByteRead = null; let ret = new Buffer(0); async.whilst( function () { return isByteRead !== false; }, function (cb) { readOneCharFromFile(fd, position++, function (err, bytesRead, buffer) { if(err){ return cb(err); } isByteRead = !!bytesRead; if(isByteRead){ ret = Buffer.concat([ret,buffer]); } cb(null); }); }, function (err) { cb(err, ret); } ); } function readOneCharFromFile(fd, position, cb) { // only need to store one byte (one character) const b = new Buffer(1); fs.read(fd, b, 0, 1, position, cb); } /// use your own file here const file = path.resolve(__dirname + '/fixtures/abc.txt'); const fd = fs.openSync(file, 'r'); // start reading at position 0, position will be incremented read(fd, 0, function (err, data) { if (err) { console.error(err.stack || err); } else { console.log('data => ', String(data)); } fs.closeSync(fd); }); 

正如你所看到的,我们每次读取文件时都会增加位置整数。 希望操作系统将文件保存在内存中。 使用async.whilst()是可以的,但我认为对于一个更实用的风格,最好不要将状态保留在函数的顶部(ret和isByteRead)。 我将把它作为一个练习给读者来实现,而不使用这些有状态variables。