2013-04-16 4 views
43

स्ट्रीम 2 इंटरफ़ेस का उपयोग करने के बाद मैं एक node.js बफर को एक पठनीय स्ट्रीम में कैसे बदल सकता हूं?स्ट्रीम 2 के रूप में एक बफर को कैसे लपेटें?

मुझे पहले से ही यह answer और स्ट्रीम-बफर मॉड्यूल मिला है लेकिन यह मॉड्यूल स्ट्रीम 1 इंटरफ़ेस पर आधारित है।

उत्तर

12

streamifier के साथ आप स्ट्रिंग्स और बफर को नई स्ट्रीम एपीआई के साथ पठनीय धाराओं में परिवर्तित कर सकते हैं।

+0

यह स्ट्रीम-बफर या विंडोज़ एज़ूर ब्लॉग पर एक समाधान जैसे किसी भी विकल्प से सबसे अच्छा काम करता है। यह निश्चित रूप से सबसे तेज़ है। – Abadaba

+8

यह लाइब्रेरी ठीक दिखती है, लेकिन @ ज़ोजन्सन का जवाब लगभग उपयोग करने में आसान है, [स्वीकार्य रूप से मामूली, जब तक एनपीजेजे दोबारा नीचे नहीं है ...] अंतर्निहित होने का लाभ। – natevw

108

संभवतः एक नया पासथ्रू स्ट्रीम उदाहरण बनाने के लिए सबसे आसान तरीका है, और बस अपने डेटा को इसमें धक्का दें। जब आप इसे अन्य धाराओं में पाइप करते हैं, तो डेटा को पहली स्ट्रीम से निकाल दिया जाएगा।

var stream = require('stream'); 

// Initiate the source 
var bufferStream = new stream.PassThrough(); 

// Write your buffer 
bufferStream.end(new Buffer('Test data.')); 

// Pipe it to something else (i.e. stdout) 
bufferStream.pipe(process.stdout) 
+7

जब तक node.js आंतरिक रूप से ऐसा नहीं करता है, यह समाधान बफर को छोटे हिस्सों में टुकड़ा नहीं करता है और इसलिए कुछ पाइप गंतव्यों के लिए आदर्श नहीं हो सकता है। * लेकिन * यदि आप देखते हैं, तो स्वीकृत उत्तर से स्ट्रीमिफायर लाइब्रेरी भी नहीं करता है। तो इसे आसान रखने के लिए +1। – natevw

+2

मुझे आश्चर्य है कि 'var bufferStream = stream.PassThrough();' का उपयोग करते हुए, 'कोड के बाद के पाठकों के लिए मंशा स्पष्ट हो सकता है, हालांकि? – natevw

+0

साथ ही, ध्यान दें कि यदि आपका गंतव्य किसी बिंदु पर स्ट्रीम को समाप्त करने की अपेक्षा करता है तो आपको शायद 'bufferStream.end() 'पर कॉल करने की आवश्यकता होगी। – natevw

24

natevw के रूप में सुझाव दिया है, यह एक stream.PassThrough उपयोग करने के लिए और भी अधिक मुहावरेदार है, और बफर के साथ end यह:

var buffer = new Buffer('foo'); 
var bufferStream = new stream.PassThrough(); 
bufferStream.end(buffer); 
bufferStream.pipe(process.stdout); 

यह भी है कि कैसे बफ़र्स बदल रहे हैं/vinyl-fs में पहुंचाया।

+1

आप पूरे बफर के साथ क्यों 'समाप्त' करेंगे? और 'पाइप' के बाद 'end' क्यों आता है – Startec

+3

'अंत (बफर)' केवल 'लिखना (बफर)' और फिर' अंत() 'है। मैं धारा समाप्त करता हूं क्योंकि अब इसकी आवश्यकता नहीं है। अंत/पाइप का क्रम यहां कोई फर्क नहीं पड़ता है, क्योंकि पासफ्रू केवल डेटा उत्सर्जित करना शुरू करता है जब डेटा ईवेंट के लिए कुछ हैंडलर होता है, जैसे पाइप। – morris4

+1

@Startec बफर को टुकड़ा नहीं करना कम ओवरहेड का मतलब है। यदि आपका उपभोक्ता बड़े हिस्से को संभाल नहीं सकता है, तो इसे किसी चीज से विभाजित करें जो भाग को विभाजित करता है। – binki

संबंधित मुद्दे