Saya harus memasukkan file teks ke terminal dan kemudian membaca data darinya, bagaimana saya bisa melakukan ini?
node server.js file.txt
Bagaimana cara saya melewati jalur dari terminal, bagaimana cara membacanya di sisi lain?
Saya harus memasukkan file teks ke terminal dan kemudian membaca data darinya, bagaimana saya bisa melakukan ini?
node server.js file.txt
Bagaimana cara saya melewati jalur dari terminal, bagaimana cara membacanya di sisi lain?
Jawaban:
Anda akan ingin menggunakan process.argv
array untuk mengakses argumen baris perintah untuk mendapatkan nama file dan modul FileSystem (fs) untuk membaca file. Sebagai contoh:
// 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)
});
Untuk memecahnya sedikit untuk Anda process.argv
biasanya akan memiliki panjang dua, item ke nol adalah penerjemah "node" dan yang pertama adalah skrip yang saat ini dijalankan oleh node, item setelah itu diteruskan pada baris perintah. Setelah Anda menarik nama file dari argv maka Anda dapat menggunakan fungsi sistem file untuk membaca file dan melakukan apapun yang Anda inginkan dengan isinya. Penggunaan sampel akan terlihat seperti ini:
$ node ./cat.js file.txt
OK: file.txt
This is file.txt!
[Sunting] Seperti yang disebutkan @wtfcoder, menggunakan metode " fs.readFile()
" mungkin bukan ide terbaik karena metode ini akan menyangga seluruh konten file sebelum menyerahkannya ke fungsi panggilan balik. Buffering ini berpotensi menggunakan banyak memori, tetapi yang lebih penting, buffering ini tidak memanfaatkan salah satu fitur inti node.js - asynchronous, evented I / O.
Cara "node" untuk memproses file besar (atau file apa pun, sebenarnya) akan menggunakan fs.read()
dan memproses setiap potongan yang tersedia karena tersedia dari sistem operasi. Namun, membaca file seperti itu mengharuskan Anda untuk melakukan penguraian / pemrosesan tambahan sendiri (mungkin) file dan sejumlah buffering mungkin tidak terhindarkan.
var lines = data.split(/\r?\n/);
, maka array "baris" akan memiliki setiap baris.
Gunakan fs dengan node.
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()
harus dihindari karena memuat SEMUA file di memori dan tidak akan memanggil callback sampai semua file telah dibaca.
Cara termudah untuk membaca file teks adalah dengan membacanya baris demi baris. Saya merekomendasikan 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 ();
Untuk struktur data yang kompleks seperti file .properties atau json, Anda perlu menggunakan parser (secara internal juga harus menggunakan pembaca buffer).
fs.readFile()
atau fs.readFileSync()
. Itu harus menjadi file besar untuk menyebabkan penantian yang nyata. Sebuah JSON file konfigurasi seperti package.json kemungkinan berada di bawah 1 kb, sehingga Anda dapat hanya fs.readFile()
dan JSON.parse()
itu.
Anda dapat menggunakan readstream dan pipe untuk membaca file baris demi baris tanpa membaca semua file ke dalam memori satu kali.
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.');
})
);
Saya memposting contoh lengkap yang akhirnya saya kerjakan. Di sini saya membaca file rooms/rooms.txt
dari skriprooms/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);
});