栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

使用Node.js实时读取文件

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用Node.js实时读取文件

如果您希望将文件作为数据的永久存储,以防止系统崩溃或正在运行的进程网络中的某个成员死亡,则流丢失,您仍然可以继续写入文件并读取从中。

如果您不需要此文件作为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);}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/614029.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号