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.