नोड js स्ट्रीम्स ट्यूटोरियल: फाइलस्ट्रीम, पाइप्स
Node.js में फ़ाइलस्ट्रीम
नोड डेटा स्थानांतरण तंत्र के रूप में स्ट्रीम्स का व्यापक उपयोग करता है।
उदाहरण के लिए, जब आप console.log फ़ंक्शन का उपयोग करके कंसोल पर कुछ भी आउटपुट करते हैं, तो आप वास्तव में कंसोल पर डेटा भेजने के लिए एक स्ट्रीम का उपयोग कर रहे होते हैं।
Node.js में फ़ाइलों से डेटा स्ट्रीम करने की क्षमता भी है ताकि उन्हें उचित तरीके से पढ़ा और लिखा जा सके। अब हम एक उदाहरण देखेंगे कि हम फ़ाइलों से पढ़ने और लिखने के लिए स्ट्रीम का उपयोग कैसे कर सकते हैं। हमें इस उदाहरण के लिए नीचे दिए गए चरणों का पालन करना होगा
चरण 1) data.txt नामक एक फ़ाइल बनाएँ जिसमें नीचे दिया गया डेटा हो। मान लें कि यह फ़ाइल हमारी स्थानीय मशीन के D ड्राइव पर संग्रहीत है।
Node.js पर ट्यूटोरियल
परिचय
कार्यक्रम
डेटा कनेक्टिविटी
चमेली का उपयोग
चरण 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 फ़ाइल का स्थान देते हैं।
- स्टीम.ऑन फ़ंक्शन एक इवेंट हैंडलर है और इसमें हम पहला पैरामीटर 'डेटा' के रूप में निर्दिष्ट कर रहे हैं। इसका मतलब है कि जब भी फ़ाइल से स्ट्रीम में डेटा आता है, तो कॉलबैक फ़ंक्शन निष्पादित करें। हमारे मामले में, हम एक कॉलबैक फ़ंक्शन परिभाषित कर रहे हैं जो 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 में पाइप्स
नोड अनुप्रयोगों के भीतर, स्ट्रीम्स को pipe() विधि का उपयोग करके एक साथ पाइप किया जा सकता है, जो दो तर्क लेता है:
- एक आवश्यक लिखने योग्य स्ट्रीम जो डेटा के लिए गंतव्य के रूप में कार्य करती है और
- विकल्पों को पास करने के लिए प्रयुक्त एक वैकल्पिक ऑब्जेक्ट.
यदि आप एक फ़ाइल से दूसरी फ़ाइल में डेटा स्थानांतरित करना चाहते हैं, तो पाइप का उपयोग करने का एक विशिष्ट उदाहरण।
तो आइए एक उदाहरण देखें कि कैसे हम पाइप का उपयोग करके एक फ़ाइल से दूसरी फ़ाइल में डेटा स्थानांतरित कर सकते हैं।
चरण 1) datainput.txt नामक एक फ़ाइल बनाएँ जिसमें नीचे दिया गया डेटा हो। मान लें कि यह फ़ाइल हमारी स्थानीय मशीन के D ड्राइव पर संग्रहीत है।
Node.js पर ट्यूटोरियल
परिचय
कार्यक्रम
Generators
डेटा कनेक्टिविटी
चमेली का उपयोग
चरण 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);
कोड स्पष्टीकरण:-
- हम सबसे पहले अपनी datainput.txt फ़ाइल के लिए एक “readstream” बना रहे हैं जिसमें हमारा वह सारा डेटा है जिसे नई फ़ाइल में स्थानांतरित करने की आवश्यकता है।
- फिर हमें अपनी dataOutput.txt फ़ाइल के लिए एक "writestream" बनाने की आवश्यकता है, जो हमारी खाली फ़ाइल है और datainput.txt फ़ाइल से डेटा के स्थानांतरण के लिए गंतव्य है।
- फिर हम रीडस्ट्रीम से डेटा को राइट स्ट्रीम में स्थानांतरित करने के लिए पाइप कमांड का उपयोग करते हैं। पाइप कमांड रीडस्ट्रीम में आने वाले सभी डेटा को ले लेगा, और उसे राइटस्ट्रीम में धकेल देगा।
यदि आप अब 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');
कोड स्पष्टीकरण:-
- 'इवेंट' मॉड्यूल को शामिल करने के लिए require फ़ंक्शन का उपयोग करें। इस मॉड्यूल के साथ, आप Node.js में इवेंट बना पाएँगे।
- एक नया इवेंट एमिटर बनाएँ। इसका उपयोग इवेंट को बाँधने के लिए किया जाता है, जो हमारे मामले में “data_received” है, कॉलबैक फ़ंक्शन से जिसे चरण 3 में परिभाषित किया गया है।
- हम एक इवेंट-संचालित फ़ंक्शन को परिभाषित करते हैं जो कहता है कि यदि “data_received” इवेंट ट्रिगर होता है तो हमें कंसोल पर “data_received” टेक्स्ट आउटपुट करना चाहिए।
- अंत में, हमारे पास eventEmiter.emit फ़ंक्शन का उपयोग करके हमारे ईवेंट का मैन्युअल ट्रिगर है। यह data_received ईवेंट को ट्रिगर करेगा।
जब प्रोग्राम चलाया जाएगा, तो नीचे दिखाए अनुसार कंसोल पर “डेटा प्राप्त हुआ” पाठ भेजा जाएगा।
उत्सर्जन घटना
इवेंट को परिभाषित करते समय, इवेंट के लिए अलग-अलग तरीके होते हैं जिन्हें लागू किया जा सकता है। यह विषय उनमें से प्रत्येक को विस्तार से देखने पर केंद्रित है।
- एक बार के इवेंट हैंडलर
कभी-कभी आप किसी घटना पर केवल पहली बार होने पर ही प्रतिक्रिया करने में रुचि रखते हैं। ऐसी स्थितियों में, आप once() विधि का उपयोग कर सकते हैं।
आइए देखें कि हम इवेंट हैंडलर्स के लिए once विधि का उपयोग कैसे कर सकते हैं।
कोड स्पष्टीकरण:-
- यहां हम 'once' विधि का उपयोग यह कहने के लिए कर रहे हैं कि घटना 'data_received' के लिए, कॉलबैक फ़ंक्शन को केवल एक बार निष्पादित किया जाना चाहिए।
- यहां हम मैन्युअल रूप से 'data_received' इवेंट को ट्रिगर कर रहे हैं।
- जब 'data_received' इवेंट को फिर से ट्रिगर किया जाता है, तो इस बार कुछ नहीं होगा। ऐसा पहले चरण के कारण है जहाँ हमने कहा था कि इवेंट को केवल एक बार ही ट्रिगर किया जा सकता है।
यदि कोड ठीक से निष्पादित किया जाता है, तो लॉग में आउटपुट 'data_received successfully' होगा। यह संदेश कंसोल में केवल एक बार दिखाई देगा।
- इवेंट श्रोताओं का निरीक्षण करना
अपने जीवनकाल के किसी भी बिंदु पर, एक इवेंट एमिटर में शून्य या उससे अधिक श्रोता जुड़े हो सकते हैं। प्रत्येक इवेंट प्रकार के लिए श्रोताओं का निरीक्षण कई तरीकों से किया जा सकता है।
यदि आप केवल संलग्न श्रोताओं की संख्या निर्धारित करने में रुचि रखते हैं, तो EventEmitter.listenerCount() विधि से आगे न देखें।
(नोट: श्रोता महत्वपूर्ण हैं, क्योंकि मुख्य प्रोग्राम को पता होना चाहिए कि क्या श्रोताओं को किसी घटना में तत्काल जोड़ा जा रहा है, अन्यथा प्रोग्राम खराब हो जाएगा, क्योंकि अतिरिक्त श्रोताओं को बुलाया जाएगा।)
कोड स्पष्टीकरण:-
- हम eventEmitter प्रकार को परिभाषित कर रहे हैं जो इवेंट-संबंधित विधियों का उपयोग करने के लिए आवश्यक है।
- फिर हम एमिटर नामक एक ऑब्जेक्ट को परिभाषित कर रहे हैं जिसका उपयोग हमारे इवेंट हैंडलर्स को परिभाषित करने के लिए किया जाएगा।
- हम 2 इवेंट हैंडलर बना रहे हैं जो मूल रूप से कुछ नहीं करते हैं। हमारे उदाहरण के लिए इसे सरल रखा गया है ताकि यह दिखाया जा सके कि listenerCount विधि कैसे काम करती है।
- अब जब आप हमारे data_received इवेंट पर listenerCount विधि को लागू करेंगे, तो यह कंसोल लॉग में इस इवेंट से जुड़े इवेंट श्रोताओं की संख्या भेजेगा।
यदि कोड ठीक से निष्पादित किया गया है, तो कंसोल लॉग में 2 का मान दिखाया जाएगा।
- नया श्रोता इवेंट
हर बार जब कोई नया इवेंट हैंडलर पंजीकृत होता है, तो इवेंट एमिटर एक 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” + इवेंट का नाम लिखा हुआ दिखाई देगा।
- यहां हम कंसोल में “इसके लिए श्रोता जोड़ा गया” पाठ + पंजीकृत प्रत्येक इवेंट के लिए इवेंट नाम लिख रहे हैं।
- हम अपने इवेंट 'data_received' के लिए 2 इवेंट हैंडलर्स परिभाषित कर रहे हैं।
यदि उपरोक्त कोड ठीक से निष्पादित किया जाता है, तो नीचे दिया गया पाठ कंसोल में दिखाया जाएगा। यह केवल यह दर्शाता है कि 'newListener' ईवेंट हैंडलर दो बार ट्रिगर किया गया था।
data_received इवेंट के लिए श्रोता जोड़ा गया
data_received इवेंट के लिए श्रोता जोड़ा गया
सारांश
- स्ट्रीम्स का उपयोग Node.js में इनपुट-आउटपुट डिवाइस से डेटा पढ़ने और लिखने के लिए किया जाता है। Node.js फ़ाइलों के लिए पठनीय और लिखने योग्य स्ट्रीम बनाने के लिए 'fs' लाइब्रेरी का उपयोग करता है। इन स्ट्रीम का उपयोग फ़ाइलों से डेटा पढ़ने और लिखने के लिए किया जा सकता है।
- पाइप का उपयोग कई स्ट्रीम को एक साथ जोड़ने के लिए किया जा सकता है। सबसे आम उदाहरणों में से एक है एक फ़ाइल से दूसरी फ़ाइल में डेटा ट्रांसफर करने के लिए रीड और राइट स्ट्रीम को एक साथ पाइप करना।
- Node.js को अक्सर इवेंट संचालित फ्रेमवर्क के रूप में भी टैग किया जाता है, और Node.js में इवेंट को परिभाषित करना बहुत आसान है। ऐसे फ़ंक्शन परिभाषित किए जा सकते हैं जो इन इवेंट पर प्रतिक्रिया देते हैं।
- इवेंट कुंजी इवेंट पर प्रतिक्रिया देने के लिए विधियों को भी उजागर करते हैं। उदाहरण के लिए, हमने once() इवेंट हैंडलर देखा है जिसका उपयोग यह सुनिश्चित करने के लिए किया जा सकता है कि जब कोई इवेंट ट्रिगर होता है तो कॉलबैक फ़ंक्शन केवल एक बार निष्पादित होता है।