Node.js 'fs.readFile () neden dize yerine bir arabellek döndürüyor?


378

test.txt(Bu Javascript kaynağının aynı klasöründe olan) içeriğini okumaya çalışıyorum ve bu kodu kullanarak görüntülemek:

var fs = require("fs");

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

İçeriği test.txtoluşturuldu nano:

Test Node.js readFile ()

Ve bunu alıyorum:

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$ 

Yanıtlar:


561

Gönderen docs:

Kodlama belirtilmezse, ham arabellek döndürülür.

Hangi açıklayabilir <Buffer ...>. utf-8Dosya adından sonraki ikinci parametreniz olarak geçerli bir kodlama belirtin . Gibi,

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

164

Deneyin

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

temel olarak kodlamayı belirtmeniz gerekir.


66

Bu Google'da yüksek geliyor, bu yüzden orijinal soru hakkında bazı bağlamsal bilgiler eklemek istiyorum (benimki vurgu):

Node.js 'fs.readFile () neden dize yerine bir arabellek döndürüyor?

Çünkü dosyalar her zaman metin değildir

Bile size programcı bildiğimiz: Düğüm okumak çalıştığınız dosyanın içinde ne bir fikri yok. Bir metin dosyası olabilir, ancak bir ZIP arşivi veya bir JPG görüntüsü de olabilir - Düğüm bilmiyor.

Çünkü metin dosyalarını okumak zor

Düğüm bir metin dosyasını okuduğunu bilse bile , hangi karakter kodlamasının kullanıldığına dair hiçbir fikre sahip olmayacaktır (yani dosyadaki baytların insan tarafından okunabilir karakterlerle nasıl eşleştiği), çünkü kodlamanın kendisi dosyada saklanmaz .

Metin dosyalarının az ya da çok güvenle karakter kodlamasını tahmin etmenin yolları vardır (bir dosyayı açarken metin editörlerinin yaptığı şeydir), ancak genellikle kodunuzun açık talimatınız olmadan tahminlere güvenmesini istemezsiniz.

Kurtarmaya tamponlar!

Bu nedenle, tüm bu ayrıntıları bilmediği ve bilemediği için Düğüm, içeriği hakkında hiçbir şey varsaymadan sadece bayt için dosya baytını okur.

Döndürülen arabellek de budur: ham ikili içerik için açılmamış bir kap. Bu içeriğin nasıl yorumlanması gerektiği geliştirici olarak size bağlıdır.


10
Bu aslında tek cevap cevaplar başlıktaki soruyu.
frzsombor

4
@frzsombor kabul edilen bir yanıt olmasa göz önüne alındığında, gerçekten OP varsaymak istiyorum edilmiştir yerine Tamponlar dizeleri almakla ilgilenen ve sadece ifade soru hakkı yapamadı. Yine de, diğer insanlar gerçek "neden" düşünülerek Google'dan buraya gelebilir, dolayısıyla cevabım. :)
Loilo

44

zaman uyumsuz:

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

Senkronizasyon:

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

38

Bir Buffer nesnesi döndürüyor.

Bir dizede olmasını istiyorsanız, şu dizeyle dönüştürebilirsiniz data.toString():

var fs = require("fs");

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

13
Biraz eskidir, ancak buffer.toString()yine de utf-8 kodlamasını varsaydığı için bu çözümün fazladan yük getirdiği bilinmelidir . Bu nedenle, bu @hvgotcodes'in cevabına eşdeğerdir (yine de daha yavaş).
Brandon

14

dataDeğişken içeren Bufferbir nesne. Aşağıdaki sözdizimini kullanarak ASCII kodlamasına dönüştürün:

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

uyumsuz:

fs.readFile('test.txt', 'utf8', function (error, data) {
    if (error) throw error;
    console.log(data.toString());
});
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.