Tại sao fs.readFile () của Node.js trả về bộ đệm thay vì chuỗi?


378

Tôi đang cố đọc nội dung của test.txt(nằm trên cùng một thư mục của nguồn Javascript) và hiển thị nội dung đó bằng mã này:

var fs = require("fs");

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

Nội dung của test.txtđã được tạo ra trên nano:

Kiểm tra Node.js readFile ()

Và tôi đang nhận được điều này:

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$ 

Câu trả lời:


561

Từ các tài liệu:

Nếu không có mã hóa được chỉ định, thì bộ đệm thô được trả về.

Mà có thể giải thích <Buffer ...>. Chỉ định mã hóa hợp lệ, ví dụ utf-8, làm tham số thứ hai của bạn sau tên tệp. Nhu la,

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

164

thử

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

về cơ bản bạn cần chỉ định mã hóa.


66

Điều này xuất hiện rất cao trên Google, vì vậy tôi muốn thêm một số thông tin theo ngữ cảnh về câu hỏi ban đầu (nhấn mạnh của tôi):

Tại sao fs.readFile () của Node.js trả về bộ đệm thay vì chuỗi?

Bởi vì tập tin không phải lúc nào cũng là văn bản

Ngay cả khi bạn là lập trình viên biết điều đó: Node không biết bạn đang cố đọc gì trong tập tin. Nó có thể là một tệp văn bản, nhưng cũng có thể là một tệp lưu trữ ZIP hoặc hình ảnh JPG - Node không biết.

Bởi vì đọc các tập tin văn bản là khó khăn

Ngay cả khi Node biết rằng nó là để đọc một tệp văn bản, thì nó vẫn không biết mã hóa ký tự nào được sử dụng (tức là cách các byte trong ánh xạ tệp thành các ký tự có thể đọc được), vì bản thân mã hóa ký tự không được lưu trữ trong tệp .

Có nhiều cách để đoán mã hóa ký tự của các tệp văn bản với độ tin cậy nhiều hơn hoặc ít hơn (đó là những gì trình soạn thảo văn bản làm khi mở tệp), nhưng bạn thường không muốn mã của mình dựa vào đoán mà không có hướng dẫn rõ ràng.

Bộ đệm để giải cứu!

Vì vậy, vì nó không và không thể biết tất cả các chi tiết này, Node chỉ đọc byte tệp cho byte, mà không giả sử bất cứ điều gì về nội dung của nó.

Và đó là những gì bộ đệm trả về là: một thùng chứa không được đề cập cho nội dung nhị phân thô. Làm thế nào nội dung này nên được giải thích là tùy thuộc vào bạn là nhà phát triển.


10
Đây là câu trả lời duy nhất thực sự trả lời câu hỏi trong tiêu đề.
frzsombor

4
@frzsombor Cho rằng có một câu trả lời được chấp nhận, tôi muốn đảm nhận OP thực sự được quan tâm trong việc chuỗi thay vì Buffers và chỉ cần không thể cụm từ câu hỏi đúng. Tuy nhiên, những người khác có thể đến đây từ Google với ý nghĩ "tại sao" thực sự, do đó, câu trả lời của tôi. :)
Loilo

44

Không đồng bộ:

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

Đồng bộ hóa:

var content = fs.readFileSync('test.txt', 'utf8');

38

Nó đang trả về một đối tượng Buffer.

Nếu bạn muốn nó trong một chuỗi, bạn có thể chuyển đổi nó bằng data.toString():

var fs = require("fs");

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

13
Loại cũ, nhưng nên biết rằng giải pháp này giới thiệu thêm chi phí kể từ khi buffer.toString()giả định mã hóa utf-8. Do đó, điều này sẽ tương đương với (mặc dù, chậm hơn) câu trả lời của @hvgotcodes.
Brandon

14

Các databiến có chứa một Bufferđối tượng. Chuyển đổi nó thành mã hóa ASCII bằng cú pháp sau:

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

Không đồng bộ:

fs.readFile('test.txt', 'utf8', function (error, data) {
    if (error) throw error;
    console.log(data.toString());
});
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.