ホームページ  >  記事  >  ウェブフロントエンド  >  NodeJS でファイルを読み書きする 3 つの方法

NodeJS でファイルを読み書きする 3 つの方法

零到壹度
零到壹度オリジナル
2018-03-28 17:27:247458ブラウズ

nodejs のファイル関連の操作はすべて fs モジュールにあり、読み取り操作と書き込み操作はよく使用される操作です。nodejs の fs モジュールには、読み取り操作用の readFile、read、createReadStream の 3 つのメソッドが用意されています。では、writeFile、write、createWriteStream の 3 つのメソッドが提供されています。これらの違いを分析してみましょう。

1. readFile と writeFile

1. readFile メソッドは、読み取られるファイルの内容です。キャッシュ領域を完全に削除し、キャッシュ領域からファイルの内容を読み取る具体的な操作は次のとおりです:

fs.readFile('./test.txt', 'utf8', function(err, data){
    console.log(data);  
});

対応する同期方式は次のとおりです:

var data = fs.readFileSync('./test.txt', 'utf8');
console.log(data);

同期方式と非同期方式の違いは次のとおりです。 : 同期を使用する場合 メソッドによって実行された操作が完了するまでは後続のコードを実行できません。非同期メソッドはコールバック関数のパラメーターとして操作結果を返します。メソッドが呼び出された後、後続のコードはすぐに実行できます。 、読み取りが完了すると、対応するコールバック関数が呼び出されます。

2. writeFile メソッドは、キャッシュ領域に書き込まれるファイルの内容全体を読み取り、キャッシュ領域の内容を一度にファイルに書き込みます。具体的な同期操作と非同期操作は次のとおりです。


//异步方法
fs.writeFile('./message.txt', '这是第一行',function(err){  
  if(err) console.log('写文件操作失败');    
  else console.log('写文件操作成功');
});

//同步方法
fs.writeFileSync('./message.txt','这是第一行');

上記の読み取りおよび書き込み操作の場合、Node.js はファイルのコンテンツを全体として扱い、キャッシュ領域を割り当て、ファイルのコンテンツを一度にキャッシュ領域に読み取ります。期間中、Node.js はその他の処理を実行できなくなります。したがって、大きなファイルの読み書きを行うと、キャッシュ領域が「爆発」する可能性があります。

2. 読み取りと書き込み

1. read または readSync メソッドは、ファイル内の小さなコンテンツを継続的にキャッシュ領域に読み取ることでファイルのコンテンツを読み取り、最後にキャッシュ領域からファイルを読み取ります。

var fs = require('fs');
fs.open('./message.txt','r',function(err,fd){    var buf = new Buffer(225);    //读取fd文件内容到buf缓存区
    fs.read(fd,buf,0,9,3,function(err,bytesRead,buffer){
        console.log(buf.slice(0,bytesRead).toString());
    }); 
    var buff = new Buffer(225);    //位置设置为null会默认从文件当前位置读取
    fs.read(fd,buff,0,3,null,function(err,bytesRead,buffer){
        console.log(buff.slice(0,bytesRead).toString());
    });    var buffer = new Buffer(225);    //同步方法读取文件
    var bytesRead = fs.readFileSync(fd,buffer,0,9,3);
    console.log(bytesRead);
    console.log(buffer.slice(0,bytesRead).toString());
});

2. write メソッドまたは writeSync メソッドがコンテンツを書き込むとき、node.js は次の処理を実行します: 1. 書き込むデータをメモリ キャッシュ領域に書き込みます。 ; 2. キャッシュ領域がいっぱいになるまで待ってから、キャッシュ領域の内容をファイルに書き込みます。 3 すべてのデータがファイルに書き込まれるまで、手順 1 と 2 を繰り返します。具体的な操作は次のとおりです。

var fs = require('fs');var buf = new Buffer('我喜爱编程');
fs.open('./mess.txt','w',function(err,fd){
    fs.write(fd,buf,3,9,0,function(err,written,buffer){
        fs.write(fd,buf,12,3,null,function(err,written,buffer){            if(err) console.log('写文件操作失败');
            console.log('写文件操作成功');
        });
    });    //同步写入
    fs.writeSync(fd,buf,3,9,0);
});

上記の読み取りおよび書き込み操作の場合、node.js はファイルを分割して段階的に操作し、ファイルの読み取りおよび書き込みのプロセス中に他の操作を実行できるようにします。 。

但有的时候我们并不关心整个文件的内容,而只关注从文件中读取到的某些数据,以及读取到数据时需要执行的处理,这时我们可以使用文件流来处理。

三、createReadStream和createWriteStream

1、createReadStream方法创建一个将文件内容读取为流数据的ReadStream对象,方法如下所示:

var fs = require('fs');var readStream = fs.createReadStream('./message.txt',{start:3,end:12});
readStream.on('open',function(fd){
    console.log('开始读取文件');
});
readStream.on('data',function(data){
    console.log('读取到数据:');
    console.log(data);
});
readStream.on('end',function(){
    console.log('文件已全部读取完毕');
});
readStream.on('close',function(){
    console.log('文件被关闭');
});
readStream.on('error',function(err){
    console.log('读取文件失败');
});

2、createWriteStream方法创建一个将流数据写入文件中的WriteStream对象,方法如下所示:

var fs = require('fs');var file = fs.createReadStream('./message.txt');var out = fs.createWriteStream('./anotherMessage.txt');
file.on('data',function(data){
    out.write(data);
});
out.on('open',function(fd){
    console.log('需要被写入的文件已打开');
});
file.on('end',function(){    //将操作系统缓存区中的数据全部写入文件
    out.end('再见',function(){
        console.log('文件全部写入完毕');
        console.log('共写入'+out.bytesWritten+'数据');
    });
});

以上方法可以对读写文件的过程中进行监听,并定义相关的方法pause和resume暂停或恢复文件的读取操作,可以监听写入时缓存区数据是否已满或者是否已全部输出,如下所示:

//监听writeStream对象的drain事件var fs = require('fs');var out = fs.createWriteStream('./test1.txt');for(var i=0;i<10000;i++){    //返回true或false true代表缓存区已满
    var flag = out.write(i.toString());
    console.log(flag);
}
out.on('drain',function(){
    console.log('操作系统缓存区中的数据已全部输出');    var out = fs.createWriteStream('./test2.txt');    for(var i=0;i<10;i++){        var flag = out.write(i.toString());
        console.log(flag);
    }
    out.on('drain',function(){
        console.log('操作系统缓存区中的数据已全部输出');
    });
});

以上がNodeJS でファイルを読み書きする 3 つの方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。