ฉันต้องส่งไฟล์ข้อความในเทอร์มินัลจากนั้นอ่านข้อมูลจากไฟล์ฉันจะทำอย่างไร
node server.js file.txt
ฉันจะผ่านเส้นทางจากอาคารผู้โดยสารได้อย่างไรฉันจะอ่านอีกด้านหนึ่งได้อย่างไร
ฉันต้องส่งไฟล์ข้อความในเทอร์มินัลจากนั้นอ่านข้อมูลจากไฟล์ฉันจะทำอย่างไร
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 รายการ zeroth เป็นตัวแปล "โหนด" และรายการแรกคือสคริปต์ที่โหนดกำลังทำงานอยู่รายการหลังจากนั้นจะถูกส่งต่อในบรรทัดคำสั่ง เมื่อคุณดึงชื่อไฟล์จาก argv แล้วคุณสามารถใช้ฟังก์ชันระบบไฟล์เพื่ออ่านไฟล์และทำอะไรก็ได้ที่คุณต้องการกับเนื้อหา ตัวอย่างการใช้งานจะมีลักษณะดังนี้:
$ node ./cat.js file.txt
OK: file.txt
This is file.txt!
[แก้ไข]ตามที่ @wtfcoder กล่าวถึงการใช้fs.readFile()เมธอด "" อาจไม่ใช่ความคิดที่ดีที่สุดเพราะจะบัฟเฟอร์เนื้อหาทั้งหมดของไฟล์ก่อนที่จะให้ฟังก์ชันเรียกกลับ การบัฟเฟอร์นี้อาจใช้หน่วยความจำจำนวนมาก แต่ที่สำคัญกว่านั้นไม่ได้ใช้ประโยชน์จากหนึ่งในคุณสมบัติหลักของ node.js - asynchronous, evented I / O
วิธี "โหนด" ในการประมวลผลไฟล์ขนาดใหญ่ (หรือไฟล์ใด ๆ จริงๆ) คือการใช้fs.read()และประมวลผลแต่ละส่วนที่มีอยู่ตามที่มีอยู่ในระบบปฏิบัติการ อย่างไรก็ตามการอ่านไฟล์ในลักษณะนี้คุณจะต้องทำการแยกวิเคราะห์ / ประมวลผลไฟล์แบบเพิ่มหน่วยของคุณเอง (อาจเป็น) และการบัฟเฟอร์จำนวนหนึ่งอาจหลีกเลี่ยงไม่ได้
var lines = data.split(/\r?\n/);แล้วอาร์เรย์ "เส้น" จะมีแต่ละบรรทัด
ใช้ 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()ควรหลีกเลี่ยงIMHO เนื่องจากโหลดไฟล์ทั้งหมดในหน่วยความจำและจะไม่เรียกการเรียกกลับจนกว่าไฟล์ทั้งหมดจะถูกอ่าน
วิธีที่ง่ายที่สุดในการอ่านไฟล์ข้อความคือการอ่านทีละบรรทัด ฉันแนะนำ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 ();
สำหรับโครงสร้างข้อมูลที่ซับซ้อนเช่นไฟล์. คุณสมบัติหรือ json คุณต้องใช้ parser (ภายในควรใช้ตัวอ่านบัฟเฟอร์ด้วย)
fs.readFile()หรือfs.readFileSync(). มันต้องเป็นไฟล์ขนาดใหญ่ที่ทำให้ต้องรออย่างเห็นได้ชัด ไฟล์ config JSON เช่น package.json มีแนวโน้มที่จะต่ำกว่า 1 กิโลเพื่อให้คุณสามารถเพียงfs.readFile()และJSON.parse()มัน
คุณสามารถใช้ 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);
});