Leer un archivo de un carácter a la vez en node.js?

¿Hay una manera de leer un símbolo a la vez en nodejs desde un archivo sin almacenar todo el archivo en la memoria? Encontré una respuesta para lineas

Intenté algo como esto pero no ayuda:

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

El flujo legible tiene un método de lectura () , en el que puede pasar un tamaño de símbolos leídos. Código de ejemplo:

 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 } }); 

Aquí hay una forma de hacerlo en el nivel inferior: fs.read (fd, buffer, offset, length, position, callback)

utilizando:

 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); }); } 

Tendrá que incrementar la posición, al leer el archivo, pero funcionará.

Aquí hay un ejemplo rápido de cómo leer un archivo completo, carácter por carácter

Solo por diversión escribí este script completo para hacerlo, solo paso una ruta de archivo diferente, y debería funcionar

 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); }); 

Como puede ver, incrementamos el entero de posición cada vez que leemos el archivo. Esperemos que el sistema operativo mantenga el archivo en la memoria a medida que avanzamos. Usar async.whilst () está bien, pero creo que para un estilo más funcional es mejor no mantener el estado en la parte superior de la función (ret y isByteRead). Lo dejaré como un ejercicio para que el lector lo implemente sin usar esas variables con estado.