Node js Streams Tutorial: Filestream, Pipes
Ροή αρχείων στο Node.js
Το Node χρησιμοποιεί εκτενώς τις ροές ως μηχανισμό μεταφοράς δεδομένων.
Για παράδειγμα, όταν εξάγετε οτιδήποτε στην κονσόλα χρησιμοποιώντας τη συνάρτηση console.log, στην πραγματικότητα χρησιμοποιείτε μια ροή για να στείλετε τα δεδομένα στην κονσόλα.
Το Node.js έχει επίσης τη δυνατότητα ροής δεδομένων από αρχεία, ώστε να μπορούν να διαβαστούν και να γραφτούν κατάλληλα. Θα δούμε τώρα ένα παράδειγμα για το πώς μπορούμε να χρησιμοποιήσουμε ροές για ανάγνωση και εγγραφή από αρχεία. Πρέπει να ακολουθήσουμε τα παρακάτω βήματα για αυτό το παράδειγμα
Βήμα 1) Δημιουργήστε ένα αρχείο που ονομάζεται data.txt το οποίο έχει τα παρακάτω δεδομένα. Ας υποθέσουμε ότι αυτό το αρχείο είναι αποθηκευμένο στη μονάδα D του τοπικού μας υπολογιστή.
Εκμάθηση στο Node.js
Εισαγωγή
Εκδηλώσεις
Συνδεσιμότητα δεδομένων
Χρήση Jasmine
Βήμα 2) Γράψτε τον σχετικό κώδικα που θα κάνει χρήση ροών για την ανάγνωση δεδομένων από το αρχείο.
var fs = require("fs"); var stream; stream = fs.createReadStream("D://data.txt"); stream.on("data", function(data) { var chunk = data.toString(); console.log(chunk); });
Επεξήγηση κώδικα: -
- Πρώτα πρέπει να συμπεριλάβουμε τις ενότητες 'fs' που περιέχουν όλες τις λειτουργίες που απαιτούνται για τη δημιουργία ροών.
- Στη συνέχεια δημιουργούμε μια αναγνώσιμη ροή χρησιμοποιώντας τη μέθοδο – createReadStream. Ως είσοδο, δίνουμε τη θέση του αρχείου data.txt μας.
- Η συνάρτηση steam.on είναι ένας χειριστής συμβάντων και σε αυτήν, καθορίζουμε την πρώτη παράμετρο ως 'δεδομένα'. Αυτό σημαίνει ότι κάθε φορά που έρχονται δεδομένα στη ροή από το αρχείο, τότε εκτελέστε μια συνάρτηση επανάκλησης. Στην περίπτωσή μας, ορίζουμε μια συνάρτηση επανάκλησης που θα εκτελεί 2 βασικά βήματα. Το πρώτο είναι να μετατρέψετε τα δεδομένα που διαβάζονται από το αρχείο ως συμβολοσειρά. Το δεύτερο θα ήταν να στείλετε τη συμβολοσειρά που μετατράπηκε ως έξοδο στην κονσόλα.
- Παίρνουμε κάθε κομμάτι δεδομένων που διαβάζεται από τη ροή δεδομένων και το μετατρέπουμε σε συμβολοσειρά.
- Τέλος, στέλνουμε την έξοδο κάθε κομματιού συμβολοσειράς που έχει μετατραπεί στην κονσόλα.
Παραγωγή:
- Εάν ο κώδικας εκτελεστεί σωστά, θα δείτε την παραπάνω έξοδο στην κονσόλα. Αυτή η έξοδος θα είναι ίδια με αυτή στο αρχείο data.txt.
Εγγραφή σε αρχείο
Με τον ίδιο τρόπο, που δημιουργούμε μια ροή ανάγνωσης, μπορούμε επίσης να δημιουργήσουμε μια ροή εγγραφής για την εγγραφή δεδομένων σε ένα αρχείο. Ας δημιουργήσουμε πρώτα ένα κενό αρχείο χωρίς περιεχόμενο που ονομάζεται data.txt. Ας υποθέσουμε ότι αυτό το αρχείο είναι τοποθετημένο στη μονάδα δίσκου D του υπολογιστή μας.
Ο παρακάτω κώδικας δείχνει πώς μπορούμε να γράψουμε δεδομένα στο αρχείο.
var fs = require("fs"); var stream; stream = fs.createWriteStream("D://data.txt"); stream.write("Tutorial on Node.js") stream.write("Introduction") stream.write("Events") stream.write("Generators") stream.write("Data Connectivity") stream.write("Using Jasmine")
Επεξήγηση κώδικα: -
- Δημιουργούμε μια εγγράψιμη ροή χρησιμοποιώντας τη μέθοδο – createWriteStream. Ως είσοδο, δίνουμε τη θέση του αρχείου data.txt μας.
- Στη συνέχεια χρησιμοποιήσαμε τη μέθοδο stream.write για να γράψουμε τις διαφορετικές γραμμές κειμένου στο αρχείο κειμένου μας. Η ροή θα φροντίσει να εγγράψει αυτά τα δεδομένα στο αρχείο data.txt.
Εάν ανοίξετε το αρχείο data.txt, θα δείτε τώρα τα ακόλουθα δεδομένα στο αρχείο
Εκμάθηση στο Node.js
Εισαγωγή
Εκδηλώσεις
Generators
Συνδεσιμότητα δεδομένων
Χρησιμοποιώντας Γιασεμί
Σωλήνες στο Node.js
Μέσα στις εφαρμογές Node, οι ροές μπορούν να διοχετεύονται μαζί χρησιμοποιώντας τη μέθοδο pipe(), η οποία παίρνει δύο ορίσματα:
- Μια Απαιτούμενη εγγράψιμη ροή που λειτουργεί ως προορισμός για τα δεδομένα και
- Ένα προαιρετικό αντικείμενο που χρησιμοποιείται για να περάσει στις επιλογές.
Χαρακτηριστικό παράδειγμα χρήσης σωλήνων, εάν θέλετε να μεταφέρετε δεδομένα από το ένα αρχείο στο άλλο.
Ας δούμε λοιπόν ένα παράδειγμα για το πώς μπορούμε να μεταφέρουμε δεδομένα από το ένα αρχείο στο άλλο χρησιμοποιώντας σωλήνες.
Βήμα 1) Δημιουργήστε ένα αρχείο που ονομάζεται datainput.txt το οποίο έχει τα παρακάτω δεδομένα. Ας υποθέσουμε ότι αυτό το αρχείο είναι αποθηκευμένο στη μονάδα D του τοπικού μας υπολογιστή.
Εκμάθηση στο Node.js
Εισαγωγή
Εκδηλώσεις
Generators
Συνδεσιμότητα δεδομένων
Χρήση Jasmine
Βήμα 2) Δημιουργήστε ένα κενό κενό αρχείο που ονομάζεται dataOutput.txt και τοποθετήστε το στη μονάδα δίσκου D του τοπικού σας υπολογιστή.
Βήμα 3) Γράψτε τον παρακάτω κώδικα για να πραγματοποιήσετε τη μεταφορά δεδομένων από το αρχείο datainput.txt στο αρχείο dataOutput.txt.
var fs = require("fs"); var readStream = fs.createReadStream("D://datainput.txt"); var writeStream = fs.createWriteStream("D://dataOutput.txt"); readStream.pipe(writeStream);
Επεξήγηση κώδικα: -
- Δημιουργούμε πρώτα μια "readstream" στο αρχείο datainput.txt που περιέχει όλα τα δεδομένα μας που πρέπει να μεταφερθούν στο νέο αρχείο.
- Στη συνέχεια, πρέπει να δημιουργήσουμε ένα «writestream» στο αρχείο dataOutput.txt, το οποίο είναι το κενό μας αρχείο και είναι ο προορισμός για τη μεταφορά δεδομένων από το αρχείο datainput.txt.
- Στη συνέχεια χρησιμοποιούμε την εντολή pipe για να μεταφέρουμε τα δεδομένα από τη ροή ανάγνωσης στη ροή εγγραφής. Η εντολή pipe θα λάβει όλα τα δεδομένα που έρχονται στη ροή ανάγνωσης και θα τα ωθήσει στη ροή εγγραφής.
Εάν ανοίξετε τώρα το αρχείο dataOutput.txt, θα δείτε όλα τα δεδομένα που υπήρχαν στο αρχείο datainput.txt.
Συμβάντα στο Node.js
Τα συμβάντα είναι μία από τις βασικές έννοιες στο Node.js και μερικές φορές το Node.js αναφέρεται ως πλαίσιο που βασίζεται σε συμβάντα.
Βασικά, ένα γεγονός είναι κάτι που συμβαίνει. Για παράδειγμα, εάν δημιουργηθεί μια σύνδεση με μια βάση δεδομένων, τότε ενεργοποιείται το συμβάν σύνδεσης βάσης δεδομένων. Ο προγραμματισμός βάσει συμβάντων είναι να δημιουργήσει συναρτήσεις που θα ενεργοποιούνται όταν ενεργοποιούνται συγκεκριμένα συμβάντα.
Ας δούμε ένα βασικό παράδειγμα καθορισμού ενός συμβάντος στο Node.js.
Θα δημιουργήσουμε ένα συμβάν που ονομάζεται 'data_received'. Όταν ενεργοποιηθεί αυτό το συμβάν, το κείμενο "δεδομένα ελήφθησαν" θα σταλεί στην κονσόλα.
var events = require('events'); var eventEmitter = new events.EventEmitter(); eventEmitter.on('data_received', function() { console.log('data received succesfully.'); }); eventEmitter.emit('data_received');
Επεξήγηση κώδικα: -
- Χρησιμοποιήστε τη συνάρτηση απαίτησης για να συμπεριλάβετε τη λειτουργική μονάδα «συμβάντα». Με αυτήν την ενότητα, θα μπορείτε να δημιουργήσετε συμβάντα στο Node.js.
- Δημιουργήστε έναν νέο πομπό συμβάντων. Αυτό χρησιμοποιείται για τη σύνδεση του συμβάντος, το οποίο στην περίπτωσή μας είναι "data_received" σε μια συνάρτηση επανάκλησης που ορίζεται στο βήμα 3.
- Ορίζουμε μια συνάρτηση που βασίζεται σε συμβάν που λέει ότι εάν σε περίπτωση που ενεργοποιηθεί το συμβάν "data_received", τότε θα πρέπει να εξάγουμε το κείμενο "data_received" στην κονσόλα.
- Τέλος, έχουμε μια μη αυτόματη ενεργοποίηση του συμβάντος μας χρησιμοποιώντας τη συνάρτηση eventEmiter.emit. Αυτό θα ενεργοποιήσει το συμβάν data_received.
Όταν εκτελείται το πρόγραμμα, το κείμενο «δεδομένα ελήφθησαν» θα σταλεί στην κονσόλα όπως φαίνεται παρακάτω.
Εκπομπή Γεγονότων
Κατά τον ορισμό συμβάντων, υπάρχουν διαφορετικές μέθοδοι για συμβάντα που μπορούν να κληθούν. Αυτό το θέμα εστιάζει στην εξέταση καθενός από αυτά λεπτομερώς.
- Χειριστές συμβάντων μιας φοράς
Μερικές φορές μπορεί να σας ενδιαφέρει να αντιδράσετε σε ένα γεγονός μόνο την πρώτη φορά που θα συμβεί. Σε αυτές τις περιπτώσεις, μπορείτε να χρησιμοποιήσετε τη μέθοδο Once().
Ας δούμε πώς μπορούμε να χρησιμοποιήσουμε τη μέθοδο μιας φοράς για χειριστές συμβάντων.
Επεξήγηση κώδικα: -
- Εδώ χρησιμοποιούμε τη μέθοδο 'one' για να πούμε ότι για το συμβάν 'data_received', η συνάρτηση επανάκλησης πρέπει να εκτελείται μόνο μία φορά.
- Εδώ ενεργοποιούμε με μη αυτόματο τρόπο το συμβάν 'data_received'.
- Όταν ενεργοποιηθεί ξανά το συμβάν 'data_received', αυτή τη φορά, δεν θα συμβεί τίποτα. Αυτό οφείλεται στο πρώτο βήμα όπου είπαμε ότι το συμβάν θα μπορούσε να ενεργοποιηθεί μόνο μία φορά.
Εάν ο κώδικας εκτελεστεί σωστά, η έξοδος στο αρχείο καταγραφής θα είναι "data_received επιτυχώς". Αυτό το μήνυμα θα εμφανιστεί μόνο μία φορά στην κονσόλα.
- Επιθεώρηση Ακροατών Εκδηλώσεων
Σε οποιοδήποτε σημείο της ζωής του, ένας εκπομπός συμβάντων μπορεί να έχει μηδέν ή περισσότερους ακροατές συνδεδεμένους με αυτόν. Οι ακροατές για κάθε τύπο συμβάντος μπορούν να επιθεωρηθούν με διάφορους τρόπους.
Εάν ενδιαφέρεστε να προσδιορίσετε μόνο τον αριθμό των συνδεδεμένων ακροατών, τότε μην ψάξετε περισσότερο από τη μέθοδο EventEmitter.listenerCount().
(Σημείωση: Οι ακροατές είναι σημαντικοί επειδή το κύριο πρόγραμμα πρέπει να γνωρίζει εάν προστίθενται ακροατές εν κινήσει σε μια εκδήλωση, διαφορετικά το πρόγραμμα θα δυσλειτουργήσει επειδή θα κληθούν επιπλέον ακροατές.)
Επεξήγηση κώδικα: -
- Ορίζουμε έναν τύπο eventEmitter που απαιτείται για τη χρήση των μεθόδων που σχετίζονται με συμβάντα.
- Στη συνέχεια, ορίζουμε ένα αντικείμενο που ονομάζεται εκπομπός που θα χρησιμοποιηθεί για τον ορισμό των χειριστών συμβάντων.
- Δημιουργούμε 2 χειριστές συμβάντων που ουσιαστικά δεν κάνουν τίποτα. Αυτό παραμένει απλό για το παράδειγμά μας για να δείξουμε πώς λειτουργεί η μέθοδος listenerCount.
- Τώρα, όταν καλείτε τη μέθοδο listenerCount στο συμβάν data_received, θα στείλει τον αριθμό των ακροατών συμβάντων που είναι συνδεδεμένοι σε αυτό το συμβάν στο αρχείο καταγραφής της κονσόλας.
Εάν ο κώδικας εκτελεστεί σωστά, η τιμή 2 θα εμφανιστεί στο αρχείο καταγραφής της κονσόλας.
- Η εκδήλωση newListener
Κάθε φορά που καταχωρείται ένας νέος χειριστής συμβάντων, ο εκπομπός συμβάντων εκπέμπει ένα συμβάν newListener. Αυτό το συμβάν χρησιμοποιείται για τον εντοπισμό νέων χειριστών συμβάντων. Συνήθως χρησιμοποιείτε το συμβάν newListener όταν χρειάζεται να εκχωρήσετε πόρους ή να εκτελέσετε κάποια ενέργεια για κάθε νέο πρόγραμμα χειρισμού συμβάντων.
var events = require('events'); var eventEmitter = events.EventEmitter; var emitter = new eventEmitter(); emitter.on("newListener", function(eventName, listener) { console.log("Added listener for " + eventName + " events"); }); emitter.on('data_received', function() {}); emitter.on('data_received', function() {});
Επεξήγηση κώδικα: -
- Δημιουργούμε ένα νέο πρόγραμμα χειρισμού συμβάντων για το συμβάν "newListener". Έτσι, κάθε φορά που καταχωρείται ένας νέος χειριστής συμβάντων, το κείμενο "Προστέθηκε πρόγραμμα ακρόασης για" + το όνομα του συμβάντος θα εμφανίζεται στην κονσόλα.
- Εδώ γράφουμε στην κονσόλα το κείμενο "Added listener for" + το όνομα συμβάντος για κάθε συμβάν που έχει καταχωρηθεί.
- Ορίζουμε 2 χειριστές συμβάντων για το συμβάν μας 'data_received'.
Εάν ο παραπάνω κώδικας εκτελεστεί σωστά, το παρακάτω κείμενο θα εμφανιστεί στην κονσόλα. Απλώς δείχνει ότι ο χειριστής συμβάντων "newListener" ενεργοποιήθηκε δύο φορές.
Προστέθηκε πρόγραμμα ακρόασης για συμβάντα data_received
Προστέθηκε πρόγραμμα ακρόασης για συμβάντα data_received
Σύνοψη
- Οι ροές χρησιμοποιούνται στο Node.js για ανάγνωση και εγγραφή δεδομένων από συσκευές Εισόδου-Εξόδου. Node.js κάνει χρήση της βιβλιοθήκης «fs» για τη δημιουργία αναγνώσιμων και εγγράψιμων ροών σε αρχεία. Αυτές οι ροές μπορούν να χρησιμοποιηθούν για την ανάγνωση και εγγραφή δεδομένων από αρχεία.
- Οι σωλήνες μπορούν να χρησιμοποιηθούν για τη σύνδεση πολλών ροών μεταξύ τους. Ένα από τα πιο συνηθισμένα παραδείγματα είναι η διοχέτευση της ροής ανάγνωσης και εγγραφής μαζί για τη μεταφορά δεδομένων από το ένα αρχείο στο άλλο.
- Το Node.js συχνά επισημαίνεται επίσης ως πλαίσιο που βασίζεται σε συμβάντα και είναι πολύ εύκολο να οριστούν συμβάντα στο Node.js. Μπορούν να οριστούν συναρτήσεις που ανταποκρίνονται σε αυτά τα συμβάντα.
- Τα συμβάντα εκθέτουν επίσης μεθόδους απόκρισης σε βασικά συμβάντα. Για παράδειγμα, έχουμε δει τον χειριστή συμβάντων Once() που μπορεί να χρησιμοποιηθεί για να βεβαιωθείτε ότι μια συνάρτηση επανάκλησης εκτελείται μόνο μία φορά όταν ενεργοποιείται ένα συμβάν.