簡體   English   中英

使用 Node.js 讀取文本文件?

[英]Read a text file using Node.js?

我需要在終端中傳入一個文本文件,然后從中讀取數據,我該怎么做?

node server.js file.txt

如何從終端傳入路徑,如何在另一側閱讀?

您需要使用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通常長度為 2,第 0 個項目是“節點”解釋器,第一個項目是節點當前正在運行的腳本,之后的項目在命令行上傳遞。 從 argv 中提取文件名后,您就可以使用文件系統函數來讀取文件並對其內容執行任何您想要的操作。 示例用法如下所示:

$ node ./cat.js file.txt
OK: file.txt
This is file.txt!

[編輯]正如@wtfcoder 所提到的,使用“ fs.readFile() ”方法可能不是最好的主意,因為它會在將文件交給回調函數之前緩沖文件的全部內容。 這種緩沖可能會使用大量內存,但更重要的是,它沒有利用 node.js 的核心特性之一——異步、事件 I/O。

處理大文件(或任何文件,實際上)的“節點”方法是使用fs.read()並處理每個可用的塊,因為它可以從操作系統中獲得。 但是,這樣讀取文件需要您自己(可能)對文件進行增量解析/處理,並且某些緩沖量可能是不可避免的。

使用節點對 fs 進行簽名。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM