Tôi cần chuyển vào một tệp văn bản trong thiết bị đầu cuối và sau đó đọc dữ liệu từ tệp đó, tôi có thể thực hiện việc này như thế nào?
node server.js file.txt
Làm cách nào để đi qua đường dẫn từ nhà ga, làm cách nào để đọc ở phía bên kia?
Tôi cần chuyển vào một tệp văn bản trong thiết bị đầu cuối và sau đó đọc dữ liệu từ tệp đó, tôi có thể thực hiện việc này như thế nào?
node server.js file.txt
Làm cách nào để đi qua đường dẫn từ nhà ga, làm cách nào để đọc ở phía bên kia?
Câu trả lời:
Bạn sẽ muốn sử dụng process.argvmảng để truy cập các đối số dòng lệnh để lấy tên tệp và mô-đun FileSystem (fs) để đọc tệp. Ví dụ:
// 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)
});
Để chia nhỏ điều đó một chút cho bạn, process.argvthường sẽ có độ dài hai, mục thứ 0 là trình thông dịch "nút" và mục đầu tiên là tập lệnh mà nút hiện đang chạy, các mục sau đó được chuyển trên dòng lệnh. Khi bạn đã lấy tên tệp từ argv thì bạn có thể sử dụng các chức năng của hệ thống tệp để đọc tệp và làm bất cứ điều gì bạn muốn với nội dung của nó. Cách sử dụng mẫu sẽ như thế này:
$ node ./cat.js file.txt
OK: file.txt
This is file.txt!
[Chỉnh sửa] Như @wtfcoder đã đề cập, sử dụng fs.readFile()phương thức "" có thể không phải là ý tưởng tốt nhất vì nó sẽ đệm toàn bộ nội dung của tệp trước khi chuyển nó cho hàm gọi lại. Bộ đệm này có thể sử dụng nhiều bộ nhớ nhưng quan trọng hơn, nó không tận dụng được một trong những tính năng cốt lõi của node.js - I / O không đồng bộ, có sự kiện.
Cách "nút" để xử lý một tệp lớn (hoặc bất kỳ tệp nào, thực sự) sẽ là sử dụng fs.read()và xử lý từng đoạn có sẵn vì nó có sẵn từ hệ điều hành. Tuy nhiên, việc đọc tệp như vậy đòi hỏi bạn phải tự mình (có thể) phân tích / xử lý tệp tăng dần và một số bộ đệm có thể không tránh khỏi.
var lines = data.split(/\r?\n/);, mảng "lines" sẽ có mỗi dòng.
Ký hiệu fs với nút.
var fs = require('fs');
try {
var data = fs.readFileSync('file.txt', 'utf8');
console.log(data.toString());
} catch(e) {
console.log('Error:', e.stack);
}
IMHO, fs.readFile()nên tránh vì nó tải TẤT CẢ tệp trong bộ nhớ và nó sẽ không gọi lại cho đến khi tất cả tệp đã được đọc.
Cách dễ nhất để đọc tệp văn bản là đọc từng dòng một. Tôi đề xuất một 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 ();
Đối với các cấu trúc dữ liệu phức tạp như tệp .properties hoặc json, bạn cần sử dụng trình phân tích cú pháp (bên trong nó cũng nên sử dụng trình đọc đệm).
fs.readFile()hoặc fs.readFileSync(). Nó phải là một tệp lớn để gây ra sự chờ đợi đáng chú ý. Một tệp cấu hình JSON như package.json có thể dưới 1 kb, vì vậy bạn có thể chỉ cần fs.readFile()và JSON.parse()nó.
Bạn có thể sử dụng readstream và pipe để đọc từng dòng của tệp mà không cần đọc tất cả tệp vào bộ nhớ một lần.
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.');
})
);
Tôi đang đăng một ví dụ hoàn chỉnh mà cuối cùng tôi đã làm việc. Ở đây tôi đang đọc trong một tệp rooms/rooms.txttừ một tập lệnhrooms/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);
});