如果您希望将文件作为数据的永久存储,以防止系统崩溃或正在运行的进程网络中的某个成员死亡,则流丢失,您仍然可以继续写入文件并读取从中。
如果您不需要此文件作为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 :[请注意,这只是演示,请检查err对象!]
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);}


