क्विज़: NodeJS I/O महारत
फ़ाइलों, स्ट्रीम्स और बफ़र्स पर अपनी समझ आज़माएँ
NodeJS I/O की दुनिया में गोता लगाने के लिए तैयार हैं? 🌊
यह क्विज़ आपके Node के I/O ऑपरेशन्स की समझ को परखेगा, बुनियादी फ़ाइल सिस्टम कार्यों से लेकर उन्नत स्ट्रीमिंग अवधारणाओं तक। हम बफ़र्स, एन्कोडिंग और डेटा को कुशलता से संभालने के सर्वोत्तम अभ्यासों को कवर करेंगे।
आइए देखें कि आप अपने बफ़र्स की तुलना में स्ट्रीम्स को कितनी अच्छी तरह जानते हैं! 🚀
यह कोड क्या करता है?
const buf = Buffer.alloc(5);console.log(buf);Buffer.alloc(size) एक नया बफ़र बनाता है जिसका आकार निर्दिष्ट है और वह शून्य से भरा होता है।
आउटपुट होगा: <Buffer 00 00 00 00 00>
यदि आप यादृच्छिक डेटा वाला बफ़र बनाना चाहते हैं, तो Buffer.allocUnsafe(5) उपयोग करें।
यह क्या प्रिंट करेगा?
const buf = Buffer.from([65]);console.log(buf.toString());एरे में मौजूद संख्याएँ ASCII कोड दर्शाती हैं:
- 65: ‘A’
toString() इन बाइट्स को डिफ़ॉल्ट रूप से UTF-8 एन्कोडिंग का उपयोग करके उनकी स्ट्रिंग प्रतिनिधित्व में बदल देता है।
आउटपुट क्रम क्या है?
import fs from 'fs';fs.readFile('test.txt', 'utf8', (err, data) => { console.log(data);});console.log('Done');चूँकि readFile असिंक्रोनस है, फ़ाइल पढ़े जाने के दौरान कोड निष्पादन जारी रहता है।
इसलिए, “Done” फ़ाइल सामग्री से पहले प्रिंट होगा।
फ़ाइल को पहले पढ़ने के लिए, आप प्रॉमिस‑आधारित संस्करण का उपयोग कर सकते हैं:
import { promises as fs } from 'fs';
async function read() { const data = await fs.readFile('test.txt', 'utf8'); console.log(data); console.log('Done');}डिफ़ॉल्ट रूप से fs.readFileSync() क्या लौटाता है?
import fs from 'fs';const content = fs.readFileSync('test.txt');fs.readFileSync() डिफ़ॉल्ट रूप से एक Buffer लौटाता है जब कोई एन्कोडिंग निर्दिष्ट नहीं की गई हो। यदि आप स्ट्रिंग चाहते हैं, तो आपको या तो:
- एन्कोडिंग निर्दिष्ट करें:
fs.readFileSync('test.txt', 'utf8') - Buffer को बदलें:
content.toString()
कौन‑से इवेंट्स का सेट आमतौर पर Readable स्ट्रीम्स के साथ उपयोग किया जाता है?
Readable स्ट्रीम्स कई महत्वपूर्ण इवेंट्स उत्सर्जित करती हैं:
- ‘data’: जब डेटा पढ़ने के लिए उपलब्ध हो
- ‘end’: जब पढ़ने के लिए और डेटा न रहे
- ‘error’: जब कोई त्रुटि उत्पन्न हो
- ‘close’: जब स्ट्रीम और अंतर्निहित संसाधन बंद हो जाएँ
const readable = fs.createReadStream('file.txt');readable.on('data', chunk => console.log(chunk));readable.on('end', () => console.log('Done!'));यह कोड क्या करता है?
import fs from 'fs';const readable = fs.createReadStream('source.txt');const writable = fs.createWriteStream('dest.txt');readable.pipe(writable);pipe() एक readable stream को writable stream से जोड़ता है, स्वचालित रूप से बैकप्रेशर संभालता है और डेटा को चंक्स में कॉपी करता है बिना पूरी फ़ाइल को मेमोरी में लोड किए।
यह बड़े फ़ाइलों के लिए fs.readFile() के बाद fs.writeFile() की तुलना में मेमोरी‑कुशल है।
रिकर्सिव विकल्प क्या करता है?
import fs from 'fs';fs.mkdirSync('./a/b/c', { recursive: true });recursive: true विकल्प पैरेंट डायरेक्टरी बनाता है यदि वे मौजूद नहीं हैं.
इस विकल्प के बिना, ’./a/b/c’ बनाने की कोशिश करने पर यदि ’./a’ या ’./a/b’ मौजूद नहीं हैं तो त्रुटि फेंकी जाएगी.
यह शेल कमांड mkdir -p के समान है.
यह क्या आउटपुट देगा?
import { Transform } from 'stream';const upperCase = new Transform({ transform(chunk, encoding, callback) { callback(null, chunk.toString().toUpperCase()); }});process.stdin .pipe(upperCase) .pipe(process.stdout);// Input: "hello world"ट्रांसफ़ॉर्म स्ट्रीम्स डेटा को उसके गुजरते समय बदलते हैं। यहाँ, प्रत्येक चंक को:
- स्ट्रिंग में बदला जाता है
- अपर केस में परिवर्तित किया जाता है
- stdout को पास किया जाता है
यह एक पाइपलाइन बनाता है जो सभी इनपुट को अपर केस में बदल देता है.
जब फ़ाइल संशोधित होती है तो fs.watch() कितनी बार फायर होना गारंटीकृत है?
import fs from 'fs';fs.watch('test.txt', (eventType, filename) => { console.log(`${filename} was changed`);});// Then modify test.txt oncefs.watch() यह गारंटी नहीं देता कि वह प्रत्येक तार्किक फ़ाइल परिवर्तन पर ठीक एक बार फायर हो। यह अक्सर कई बार फायर होता है क्योंकि कई टेक्स्ट एडिटर:
- अस्थायी फ़ाइल में सहेजते हैं
- उसे लक्ष्य फ़ाइल के रूप में पुनःनामित करते हैं
अधिक भरोसेमंद वॉचिंग के लिए, आप विचार कर सकते हैं:
chokidarपैकेज- कॉलबैक को डिबाउंस करना
fs.watchFile()का उपयोग (हालांकि यह कम कुशल है)
आउटपुट क्या होगा?
const buf1 = Buffer.from('Hello');const buf2 = Buffer.from('Hello');console.log(buf1 === buf2);बफ़र को रेफ़रेंस द्वारा तुलना किया जाता है, मान द्वारा नहीं। भले ही उनमें समान डेटा हो, वे अलग-अलग ऑब्जेक्ट होते हैं।
बफ़र की सामग्री की तुलना करने के लिए, उपयोग करें:
buf1.equals(buf2) // true// orBuffer.compare(buf1, buf2) === 0 // trueस्ट्रीम बैकप्रेशर का मुख्य उद्देश्य क्या है?
बैकप्रेशर एक तंत्र है जो मेमोरी ओवरफ़्लो को रोकता है, जब लिखने वाला भाग गति नहीं पकड़ पाता तो पढ़ना रोककर।
मैनुअल बैकप्रेशर का उदाहरण:
readable.on('data', (chunk) => { const canContinue = writable.write(chunk); if (!canContinue) { readable.pause(); writable.once('drain', () => readable.resume()); }});pipe() इसे स्वचालित रूप से संभालता है!
यह कोड क्या करता है?
import fs from 'fs';fs.symlinkSync('target.txt', 'link.txt');symlinkSync एक सिंबॉलिक लिंक (शॉर्टकट की तरह) लक्ष्य फ़ाइल के लिए बनाता है.
हार्ड लिंक से मुख्य अंतर:
- डायरेक्टरीज़ को लिंक कर सकता है
- फ़ाइल सिस्टम्स के बीच लिंक कर सकता है
- यदि लक्ष्य हटाया जाए तो टूट जाता है
इसके बजाय हार्ड लिंक बनाने के लिए:
fs.linkSync('target.txt', 'hardlink.txt');Node.js स्ट्रीम्स किन मोड्स में काम कर सकते हैं?
स्ट्रीम्स निम्न मोड्स में काम कर सकते हैं:
- बाइनरी मोड (डिफ़ॉल्ट): बफ़र्स और स्ट्रिंग्स के लिए
- ऑब्जेक्ट मोड: किसी भी जावास्क्रिप्ट वैल्यू के लिए
ऑब्जेक्ट मोड का उदाहरण:
import { Transform } from 'stream';const objectStream = new Transform({ objectMode: true, transform(chunk, encoding, callback) { callback(null, { value: chunk }); }});इस कॉलबैक में fd पैरामीटर का प्रकार क्या है?
import fs from 'fs';fs.open('test.txt', 'r', (err, fd) => { console.log(typeof fd);});फ़ाइल डिस्क्रिप्टर संख्याएँ हैं जो ऑपरेटिंग सिस्टम में खुले फ़ाइलों को विशिष्ट रूप से पहचानती हैं.
पहले तीन फ़ाइल डिस्क्रिप्टर आरक्षित होते हैं:
- 0: stdin
- 1: stdout
- 2: stderr
फ़ाइल डिस्क्रिप्टर को हमेशा बंद करना याद रखें:
fs.close(fd, (err) => { if (err) throw err;});इस स्ट्रिंग को UTF-8 में कितने बाइट्स लगेंगे?
const str = "Hello 🌍";const buf = Buffer.from(str);console.log(buf.length);UTF-8 में:
- ASCII अक्षर (जैसे ‘Hello ’) प्रत्येक 1 बाइट लेते हैं
- पृथ्वी इमोजी 🌍 4 बाइट्स लेता है
इसलिए: 5 (Hello) + 1 (space) + 4 (🌍) = 10 बाइट्स
बाइट्स देखने के लिए:
console.log(buf); // <Buffer 48 65 6c 6c 6f 20 f0 9f 8c 8d>आशा है आपको अपना NodeJS I/O ज्ञान परखना मज़ेदार लगा! और चाहिए? अधिक चुनौतियों के लिए मेरी क्विज़ कलेक्शन देखें!