Node.js의 fs.readFile ()이 문자열 대신 버퍼를 반환하는 이유는 무엇입니까?


378

test.txt(Javascript 소스의 동일한 폴더에있는) 의 내용을 읽고이 코드를 사용하여 표시하려고합니다.

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 ()이 문자열 대신 버퍼를 반환하는 이유 는 무엇 입니까?

파일은 항상 텍스트가 아니기 때문에

해도 당신이 프로그래머는 그것을 알고 : 노드 읽고하려는 파일에 무엇이 아무 생각이 없습니다. 텍스트 파일 일 수도 있지만 ZIP 아카이브 또는 JPG 이미지 일 수도 있습니다. 노드는 알 수 없습니다.

텍스트 파일을 읽는 것이 까다롭기 때문에

Node 가 텍스트 파일을 읽어야 한다는 것을 알고 있더라도 문자 인코딩 자체가 파일에 저장되지 않기 때문에 어떤 문자 인코딩 이 사용되는지 (즉, 파일의 바이트가 사람이 읽을 수있는 문자에 어떻게 매핑되는지) 여전히 알 수 없습니다. .

자신감이있는 텍스트 파일의 문자 인코딩 을 추측 할 수 있는 방법이 있지만 (파일을 열 때 텍스트 편집기가 수행하는 작업) 일반적으로 명시적인 지시없이 코드가 추측에 의존하는 것을 원하지 않습니다.

구조에 버퍼!

따라서 모든 세부 사항을 알 수 없으며 알 수 없기 때문에 Node는 내용에 대해 아무 것도 가정하지 않고 바이트 단위로 파일 바이트를 읽습니다.

그리고 그것은 반환 된 버퍼입니다 : 원시 바이너리 컨텐츠를위한 미처리 된 컨테이너. 이 내용을 해석하는 방법은 개발자에게 달려 있습니다.


10
제목의 질문에 실제로 답변 하는 유일한 답변입니다 .
— frzsombor

4
@frzsombor 수락 된 답가 있음을 감안할 때, 난 정말 OP 가정 것 되었다 대신 버퍼의 문자열을 얻기에 관심을 그냥 문구 질문 권리를 할 수 없습니다. 그럼에도 불구하고 다른 사람들은 실제 "이유"를 염두에두고 Google에서 여기에 올 수 있습니다. :)
— Loilo

44

비동기 :

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

동조:

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

38

Buffer 오브젝트를 리턴하고 있습니다.

문자열로 원하면 다음과 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의 답변과 동일하지만 (아마도 느립니다).
— Brandon

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());
});
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.