nodeJSにおける読み書きの方法の違い

9980 ワード

説明:nodejsのすべてのファイルに関する操作はfsモジュールの中にあります.読み書き操作は私達がよく使う操作です.nodejsのfsモジュールは読み体操に対してreadFile,read,createReadStreamの3つの方法を提供しています.書き込み操作に対してはwriteFile,write,createWritestreamの3つの方法を提供しています.
一、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は他の処理を実行できなくなります.ですから、大きなファイルを読むと、キャッシュエリアが「パンク」する恐れがあります.
二、readとwrite
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とreumeを定義し、ファイルの読み込みを一時停止または再開し、書き込み時にキャッシュエリアのデータが満タンになったかどうか、または全部出力されたかどうかを傍受することができます.
//  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('                ');
    });
});
 
転載先:https://www.cnblogs.com/pp-cat/p/6504655.html