Node.js की fs.readFile () स्ट्रिंग के बजाय बफर क्यों लौटाती है?


377

मैं test.txt(जो जावास्क्रिप्ट स्रोत के एक ही फ़ोल्डर में है) की सामग्री को पढ़ने की कोशिश कर रहा हूं और इस कोड का उपयोग करके इसे प्रदर्शित कर रहा हूं :

var fs = require("fs");

fs.readFile("test.txt", function (err, data) {
    if (err) throw err;
    console.log(data);
});

की सामग्री test.txtपर बनाया गया था nano:

परीक्षण Node.js readFile ()

और मुझे यह मिल रहा है:

Nathan-Camposs-MacBook-Pro:node_test Nathan$ node main.js
<Buffer 54 65 73 74 69 6e 67 20 4e 6f 64 65 2e 6a 73 20 72 65 61 64 46 69 6c 65 28 29>
Nathan-Camposs-MacBook-Pro:node_test Nathan$ 

जवाबों:


561

से डॉक्स:

यदि कोई एन्कोडिंग निर्दिष्ट नहीं किया गया है, तो कच्चे बफर वापस आ गया है।

जो समझा सकता है <Buffer ...>। उदाहरण के लिए utf-8, फ़ाइल नाम के बाद आपके दूसरे पैरामीटर के रूप में एक मान्य एन्कोडिंग निर्दिष्ट करें । जैसे कि,

fs.readFile("test.txt", "utf8", function(err, data) {...});

164

प्रयत्न

fs.readFile("test.txt", "utf8", function(err, data) {...});

मूल रूप से आपको एन्कोडिंग निर्दिष्ट करने की आवश्यकता है।


66

यह Google पर उच्च स्तर पर आता है, इसलिए मैं मूल प्रश्न (जोर मेरा) के बारे में कुछ प्रासंगिक जानकारी जोड़ना चाहता हूं:

Node.js की fs.readFile () स्ट्रिंग के बजाय बफर क्यों लौटाती है?

क्योंकि फाइलें हमेशा टेक्स्ट नहीं होती हैं

भले ही आप प्रोग्रामर के रूप में यह जानते हों: नोड को पता नहीं है कि उस फ़ाइल में क्या है जिसे आप पढ़ने की कोशिश कर रहे हैं। यह एक पाठ फ़ाइल हो सकती है, लेकिन यह सिर्फ एक ज़िप संग्रह या एक JPG छवि हो सकती है - नोड पता नहीं है।

क्योंकि पाठ फ़ाइलों को पढ़ना मुश्किल है

यहां तक ​​कि अगर नोड को पता था कि यह एक पाठ फ़ाइल को पढ़ना है, तब भी यह पता नहीं होगा कि कौन से वर्ण एन्कोडिंग का उपयोग किया जाता है (यानी फ़ाइल मैप में बाइट मानव-पठनीय वर्णों के लिए), क्योंकि वर्ण एन्कोडिंग स्वयं फ़ाइल में संग्रहीत नहीं है ।

अधिक या कम आत्मविश्वास के साथ पाठ फ़ाइलों के चरित्र एन्कोडिंग का अनुमान लगाने के तरीके हैं (यह एक फ़ाइल खोलने पर पाठ संपादक क्या करते हैं), लेकिन आप आमतौर पर अपने कोड को अपने स्पष्ट निर्देश के बिना अनुमानों पर भरोसा नहीं करना चाहते हैं।

बचाव के लिए बफर!

इसलिए, क्योंकि यह इन सभी विवरणों को नहीं जानता है और न ही बता सकता है, नोड केवल अपनी सामग्री के बारे में कुछ भी ग्रहण किए बिना, बाइट के लिए फ़ाइल बाइट पढ़ता है।

और यह है कि लौटा हुआ बफर क्या है: कच्चे द्विआधारी सामग्री के लिए एक अनोपिनियेटेड कंटेनर। डेवलपर के रूप में इस सामग्री की व्याख्या कैसे की जानी चाहिए।


10
यह एकमात्र ऐसा उत्तर है जो वास्तव में शीर्षक में प्रश्न का उत्तर देता है।
फ्रेज़्समबोर

4
@frzsombor यह देखते हुए कि एक स्वीकृत जवाब है, मुझे लगता है कि ओपी वास्तव में बफ़र्स के बजाय स्ट्रिंग्स प्राप्त करने में रुचि रखता था और बस सवाल को सही नहीं कह सकता था। फिर भी, अन्य लोग Google से वास्तविक "क्यों" को ध्यान में रखकर आ सकते हैं, इसलिए मेरा जवाब है। :)
Loilo


38

यह एक बफर ऑब्जेक्ट लौटा रहा है।

यदि आप इसे एक स्ट्रिंग में चाहते हैं, तो आप इसे इसके साथ बदल सकते हैं data.toString():

var fs = require("fs");

fs.readFile("test.txt", function (err, data) {
    if (err) throw err;
    console.log(data.toString());
});

13
पुराने की तरह, लेकिन यह ज्ञात होना चाहिए कि यह समाधान अतिरिक्त ओवरहेड का परिचय देता है क्योंकि buffer.toString()वैसे भी utf-8 एन्कोडिंग है। इस प्रकार, यह (हालांकि, धीमी) @hvgotcodes के उत्तर के बराबर होगा।
ब्रैंडन

14

dataचर एक में शामिल है Bufferवस्तु। निम्नलिखित सिंटैक्स का उपयोग करके इसे ASCII एन्कोडिंग में परिवर्तित करें:

data.toString('ascii', 0, data.length)

अतुल्यकालिक रूप से:

fs.readFile('test.txt', 'utf8', function (error, data) {
    if (error) throw error;
    console.log(data.toString());
});
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.