昨日の、node.jsのつづき。
■同期して、読み書き
node.jsで、ファイルを読み書きする場合、2通りの方法がある
同期して読み書き
非同期読み書き
同期の場合は、メソッドに、Syncをつける
こんなかんじ。
buf = fs.readFileSync('./helloworld.js',"utf-8");
fs.writeFileSync('./helloworld2.js', buf, 'utf8');
で、同期の読み書きをしている。
このプログラムは、http://127.0.0.1:8124/にアクセスすると、
helloworld.jsのプログラム内容を表示し、
その内容をhelloworld2.js
に書き出す
というもので、これは、問題なく、この処理をする。
■非同期で読み書き
ところが、非同期(fs.readFile、fs.writeFile)で、同じことをしてみると、
この結果は様々考えられるが、私のところでは、
画面には、abcと表示され、ファイルにもabcと書き出される。
つまり、readFileで指定したコールバック関数には、入っていない。
一方readFileを外に出すと、
この結果も様々考えられるが、私のところでは、
helloworld.jsの内容が表示され、ファイルにも書き出される
■理由
非同期だから。
非同期の場合、readFileで読み込みが完了するのを待たずに、次のwriteFileの処理に入る。
結果、2番目のケースでは、bufに読み込み内容がセットされる前に、次のwriteFileの処理に入ったので、bufの中身は書き換わらなかった。
3番目のケースでは、ブラウザで表示する前に十分な時間があったから、読み込みが完了、bufにデータが入った状態で、writeFileの処理に入ったので中身を書き出せた。
■同期して、読み書き
node.jsで、ファイルを読み書きする場合、2通りの方法がある
同期して読み書き
非同期読み書き
同期の場合は、メソッドに、Syncをつける
こんなかんじ。
var sys = require('sys'); var http = require('http'); var fs = require('fs'); var outdata; var server = http.createServer( function (request, response) { response.writeHead(200, {'Content-Type': 'text/plain'}); buf = fs.readFileSync('./helloworld.js',"utf-8"); fs.writeFileSync('./helloworld2.js', buf, 'utf8'); response.write(buf); response.end(); } ).listen(8124); sys.log('Server running at http://127.0.0.1:8124/'); |
buf = fs.readFileSync('./helloworld.js',"utf-8");
fs.writeFileSync('./helloworld2.js', buf, 'utf8');
で、同期の読み書きをしている。
このプログラムは、http://127.0.0.1:8124/にアクセスすると、
helloworld.jsのプログラム内容を表示し、
その内容をhelloworld2.js
に書き出す
というもので、これは、問題なく、この処理をする。
■非同期で読み書き
ところが、非同期(fs.readFile、fs.writeFile)で、同じことをしてみると、
|
この結果は様々考えられるが、私のところでは、
画面には、abcと表示され、ファイルにもabcと書き出される。
つまり、readFileで指定したコールバック関数には、入っていない。
一方readFileを外に出すと、
|
この結果も様々考えられるが、私のところでは、
helloworld.jsの内容が表示され、ファイルにも書き出される
■理由
非同期だから。
非同期の場合、readFileで読み込みが完了するのを待たずに、次のwriteFileの処理に入る。
結果、2番目のケースでは、bufに読み込み内容がセットされる前に、次のwriteFileの処理に入ったので、bufの中身は書き換わらなかった。
3番目のケースでは、ブラウザで表示する前に十分な時間があったから、読み込みが完了、bufにデータが入った状態で、writeFileの処理に入ったので中身を書き出せた。