Why does Node.js' fs.readFile() return a buffer instead of string?

后端 未结 6 948
梦毁少年i
梦毁少年i 2020-11-30 17:33

I\'m trying to read the content of test.txt(which is on the same folder of the Javascript source) and display it using this code:

var fs = requi         


        
相关标签:
6条回答
  • 2020-11-30 17:52

    Async:

    fs.readFile('test.txt', 'utf8', callback);
    

    Sync:

    var content = fs.readFileSync('test.txt', 'utf8');
    
    0 讨论(0)
  • 2020-11-30 17:55

    It is returning a Buffer object.

    If you want it in a string, you can convert it with data.toString():

    var fs = require("fs");
    
    fs.readFile("test.txt", function (err, data) {
        if (err) throw err;
        console.log(data.toString());
    });
    
    0 讨论(0)
  • 2020-11-30 17:56

    This comes up high on Google, so I'd like to add some contextual information about the original question (emphasis mine):

    Why does Node.js' fs.readFile() return a buffer instead of string?

    Because files aren't always text

    Even if you as the programmer know it: Node has no idea what's in the file you're trying to read. It could be a text file, but it could just as well be a ZIP archive or a JPG image — Node doesn't know.

    Because reading text files is tricky

    Even if Node knew it were to read a text file, it still would have no idea which character encoding is used (i.e. how the bytes in the file map to human-readable characters), because the character encoding itself is not stored in the file.

    There are ways to guess the character encoding of text files with more or less confidence (that's what text editors do when opening a file), but you usually don't want your code to rely on guesses without your explicit instruction.

    Buffers to the rescue!

    So, because it does not and can not know all these details, Node just reads the file byte for byte, without assuming anything about its contents.

    And that's what the returned buffer is: an unopinionated container for raw binary content. How this content should be interpreted is up to you as the developer.

    0 讨论(0)
  • 2020-11-30 17:56

    The data variable contains a Buffer object. Convert it into ASCII encoding using the following syntax:

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

    Asynchronously:

    fs.readFile('test.txt', 'utf8', function (error, data) {
        if (error) throw error;
        console.log(data.toString());
    });
    
    0 讨论(0)
  • 2020-11-30 18:00

    From the docs:

    If no encoding is specified, then the raw buffer is returned.

    Which might explain the <Buffer ...>. Specify a valid encoding, for example utf-8, as your second parameter after the filename. Such as,

    fs.readFile("test.txt", "utf8", function(err, data) {...});
    
    0 讨论(0)
  • 2020-11-30 18:02

    Try:

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

    Basically, you need to specify the encoding.

    0 讨论(0)
提交回复
热议问题