Читать текстовый файл, используя Node.js?
Мне нужно передать текстовый файл в терминале, а затем прочитать данные из него, как я могу это сделать?
node server.js file.txt
Как пройти по пути от терминала, как мне прочитать это на другой стороне?
5 ответов
Вы хотите использовать process.argv
массив для доступа к аргументам командной строки для получения имени файла и модуля FileSystem (fs) для чтения файла. Например:
// Make sure we got a filename on the command line.
if (process.argv.length < 3) {
console.log('Usage: node ' + process.argv[1] + ' FILENAME');
process.exit(1);
}
// Read the file and print its contents.
var fs = require('fs')
, filename = process.argv[2];
fs.readFile(filename, 'utf8', function(err, data) {
if (err) throw err;
console.log('OK: ' + filename);
console.log(data)
});
Чтобы сломать это немного для вас process.argv
обычно будет иметь длину два, нулевой элемент - интерпретатор "узла", а первый - скрипт, который в данный момент выполняется узлом, элементы после которого были переданы в командной строке. После того, как вы извлекли имя файла из argv, вы можете использовать функции файловой системы, чтобы прочитать файл и делать с его содержимым все, что вы хотите. Пример использования будет выглядеть так:
$ node ./cat.js file.txt
OK: file.txt
This is file.txt!
[Редактировать] Как упоминает @wtfcoder, используя " fs.readFile()
"Метод не может быть лучшей идеей, потому что он буферизирует все содержимое файла перед передачей его функции обратного вызова. Эта буферизация может потенциально использовать много памяти, но, что более важно, она не использует ни одну из основных функций of node.js - асинхронный, четный ввод / вывод.
"Узловой" способ обработки большого файла (или любого другого файла) - использовать fs.read()
и обрабатывать каждый доступный блок так, как он доступен из операционной системы. Однако чтение файла как такового требует от вас собственного (возможно) инкрементального синтаксического анализа / обработки файла, и некоторая степень буферизации может быть неизбежной.
Назначить фс с узлом.
var fs = require('fs');
try {
var data = fs.readFileSync('file.txt', 'utf8');
console.log(data.toString());
} catch(e) {
console.log('Error:', e.stack);
}
ПО МОЕМУ МНЕНИЮ, fs.readFile()
его следует избегать, поскольку он загружает ВСЕ файл в память и не вызывает обратный вызов, пока весь файл не будет прочитан.
Самый простой способ прочитать текстовый файл - прочитать его построчно. Я рекомендую BufferedReader:
new BufferedReader ("file", { encoding: "utf8" })
.on ("error", function (error){
console.log ("error: " + error);
})
.on ("line", function (line){
console.log ("line: " + line);
})
.on ("end", function (){
console.log ("EOF");
})
.read ();
Для сложных структур данных, таких как.properties или json-файлы, вам нужно использовать синтаксический анализатор (внутренне он также должен использовать буферизованную программу чтения).
Вы можете использовать readstream и pipe для построчного чтения файла без единовременного чтения всего файла в память.
var fs = require('fs'),
es = require('event-stream'),
os = require('os');
var s = fs.createReadStream(path)
.pipe(es.split())
.pipe(es.mapSync(function(line) {
//pause the readstream
s.pause();
console.log("line:", line);
s.resume();
})
.on('error', function(err) {
console.log('Error:', err);
})
.on('end', function() {
console.log('Finish reading.');
})
);
Я публикую полный пример, который я наконец получил. Здесь я читаю в файле rooms/rooms.txt
из сценария rooms/rooms.js
var fs = require('fs');
var path = require('path');
var readStream = fs.createReadStream(path.join(__dirname, '../rooms') + '/rooms.txt', 'utf8');
let data = ''
readStream.on('data', function(chunk) {
data += chunk;
}).on('end', function() {
console.log(data);
});
Асинхронный образ жизни:
#! /usr/bin/node
const fs = require('fs');
function readall (stream)
{
return new Promise ((resolve, reject) => {
const chunks = [];
stream.on ('error', (error) => reject (error));
stream.on ('data', (chunk) => chunk && chunks.push (chunk));
stream.on ('end', () => resolve (Buffer.concat (chunks)));
});
}
function readfile (filename)
{
return readall (fs.createReadStream (filename));
}
(async () => {
let content = await readfile ('/etc/ssh/moduli').catch ((e) => {})
if (content)
console.log ("size:", content.length,
"head:", content.slice (0, 46).toString ());
})();