システムがクラッシュしたり、実行中のプロセスのネットワーク内のメンバーの 1 人が死亡した場合にストリームが失われるのを防ぐために、データの永続的なストアとしてファイルを保持したい場合でも、ファイルへの書き込みと読み取りを続行できます。それから。
Java プロセスから生成された結果の永続的なストレージとしてこのファイルを必要としない場合は、Unix ソケットを使用する方が、使いやすさとパフォーマンスの両方の点ではるかに優れています。
fs.watchFile()
ファイルシステムが報告するようにファイル統計で機能し、すでに書き込まれているファイルを読みたいので、これは必要なものではありません。
短い更新:fs.watchFile()
前の段落でファイル統計を使用したことを非難していましたが、以下のコード例で自分自身でまったく同じことを行っていたことを認識して、非常に申し訳ありません! すでに読者に「気をつけて!」と警告していましたが。よくテストすることさえせずに、ほんの数分で書いたからです。fs.watch()
それでも、代わりに使用するwatchFile
かfstatSync
、基になるシステムがサポートしている場合は、より適切に実行できます。
ファイルからの読み取り/書き込みについて、休憩の楽しみのために以下に書きました。
test-fs-writer.js : [Java プロセスでファイルを書き込むため、これは必要ありません]
var fs = require('fs'),
lineno=0;
var stream = fs.createWriteStream('test-read-write.txt', {flags:'a'});
stream.on('open', function() {
console.log('Stream opened, will start writing in 2 secs');
setInterval(function() { stream.write((++lineno)+' oi!\n'); }, 2000);
});
test-fs-reader.js : [注意してください。これは単なるデモンストレーションです。エラー オブジェクトをチェックしてください!]
var fs = require('fs'),
bite_size = 256,
readbytes = 0,
file;
fs.open('test-read-write.txt', 'r', function(err, fd) { file = fd; readsome(); });
function readsome() {
var stats = fs.fstatSync(file); // yes sometimes async does not make sense!
if(stats.size<readbytes+1) {
console.log('Hehe I am much faster than your writer..! I will sleep for a while, I deserve it!');
setTimeout(readsome, 3000);
}
else {
fs.read(file, new Buffer(bite_size), 0, bite_size, readbytes, processsome);
}
}
function processsome(err, bytecount, buff) {
console.log('Read', bytecount, 'and will process it now.');
// Here we will process our incoming data:
// Do whatever you need. Just be careful about not using beyond the bytecount in buff.
console.log(buff.toString('utf-8', 0, bytecount));
// So we continue reading from where we left:
readbytes+=bytecount;
process.nextTick(readsome);
}
安全に使用を避け、代わりに直接nextTick
呼び出すことができます。readsome()
ここではまだ同期作業を行っているため、まったく必要ありません。私はそれが好きです。:p
オリバーロイドによる編集
上記の例を取り上げますが、CSV データを読み取るように拡張すると、次のようになります。
var lastLineFeed,
lineArray;
function processsome(err, bytecount, buff) {
lastLineFeed = buff.toString('utf-8', 0, bytecount).lastIndexOf('\n');
if(lastLineFeed > -1){
// Split the buffer by line
lineArray = buff.toString('utf-8', 0, bytecount).slice(0,lastLineFeed).split('\n');
// Then split each line by comma
for(i=0;i<lineArray.length;i++){
// Add read rows to an array for use elsewhere
valueArray.push(lineArray[i].split(','));
}
// Set a new position to read from
readbytes+=lastLineFeed+1;
} else {
// No complete lines were read
readbytes+=bytecount;
}
process.nextTick(readFile);
}