如果您希望将文件作为数据的持久存储,以防系统崩溃或运行进程中的任一成员死亡导致流丢失,您仍然可以继续写入和读取文件。
如果您不需要该文件作为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);
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.');
console.log(buff.toString('utf-8', 0, bytecount));
readbytes+=bytecount;
process.nextTick(readsome);
}
你可以安全地避免使用
nextTick
,直接调用
readsome()
即可。由于我们仍在同步工作,因此从任何意义上讲都不必要。我只是喜欢它。 :p
编辑者:Oliver Lloyd
将上面的示例扩展到读取CSV数据:
var lastLineFeed,
lineArray;
function processsome(err, bytecount, buff) {
lastLineFeed = buff.toString('utf-8', 0, bytecount).lastIndexOf('\n');
if(lastLineFeed > -1){
lineArray = buff.toString('utf-8', 0, bytecount).slice(0,lastLineFeed).split('\n');
for(i=0;i<lineArray.length;i++){
valueArray.push(lineArray[i].split(','));
}
readbytes+=lastLineFeed+1;
} else {
readbytes+=bytecount;
}
process.nextTick(readFile);
}