在node.js中一次读取一个文件的文件?
有没有办法从文件中一次读取nodejs中的一个符号,而不将整个文件存储在内存中? 我找到了线条的答案
我尝试过这样的东西,但它没有帮助:
stream = fs.createReadStream("walmart.dump", {
encoding: 'utf8',
fd: null,
bufferSize: 1,
});
stream.on('data', function(sym){
console.log(sym);
});
可读流有一个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);
});
}
当你读取文件时,你将不得不增加位置,但它会起作用。
这里是一个简单的例子,说明如何逐个字符地读取整个文件
为了好玩,我写了这个完整的脚本来完成它,只需传入不同的文件路径,它就可以工作
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)。 我将把它作为练习留给读者来实现,而不使用这些有状态变量。
链接地址: http://www.djcxy.com/p/52289.html