来自文件读取流的Nodejs不定式流

Posted

技术标签:

【中文标题】来自文件读取流的Nodejs不定式流【英文标题】:Nodejs infinitive stream from file read stream 【发布时间】:2015-12-08 12:44:45 【问题描述】:

我在尝试完成相当平庸的任务时遇到了麻烦。我需要从输入 txt 文件创建 nodejs 可读流。我需要对此流执行一些转换(为每一行创建 JSON 对象)。

问题是我希望这个流是不定式的:在读取最后一行之后,流应该从头开始。我的解决方案有效,但收到警告消息:

(node) 警告:检测到可能的 EventEmitter 内存泄漏。添加了 11 个排水监听器。使用emitter.setMaxListeners() 增加限制。

我希望找到简单的解决方案,而不是直接读取和缓冲文件。

//Transform stream object
var TransformStream = function () 
    Transform.call(this, objectMode: true);
;
util.inherits(TransformStream, Transform);

TransformStream.prototype._transform = onTransform;
TransformStream.prototype._flush = onEnd;

var ts = new TransformStream();

var infinStream = function () 
    var r = fs.createReadStream(filePath);
    r.pipe(split(), end: false)
        .pipe(ts, end: false);
    r.once('end', function () 
        //console.log('\n\n\n\nRead file stream finished. Lines counted:\n\n\n\n' + detectionCounter);
        r.removeAllListeners();
        r.destroy();
        infinStream();
    );
    return r;
;
infinStream();

return ts;

【问题讨论】:

如果你有一个不是不定式大的文件,那么总会有一个结束。但是你为什么想要一个循环。你想要返回的数据做什么? 当没有答案时,这意味着我完全错过了一些东西。我将设备输出保存在 txt 文件中。我想要的是模拟设备输出的服务器 - 意味着它将从文件中流式传输数据,直到中断。 为什么要使用循环文件流来模拟设备输出?设备输出也不是不定式大。我也认为你在这里遗漏了一些东西。我不明白你想做什么,但我很确定解决方案不是不定式大文件流。 我需要每天 24 小时运行的服务器,并且会一直模拟设备输出。无论设备输出有多大,我都需要使其不定式。我想到的最简单的解决方案是将导出不定式流的模块。我想知道它是否存在更智能的解决方案。 【参考方案1】:

来自cmets:

我需要每天 24 小时运行的服务器,并且将模拟设备 一直输出。

为此,递归函数是个好主意。你做的方法没问题。当您不需要对数据进行不同的转换任务时,实际上不需要流。简单事件可以完全按照您的意愿进行,并且更容易理解。

您的代码中的错误是您放置监听器的地方。侦听器r.once 在您的递归函数中。您在函数内部定义 r,因此每个函数调用都会创建一个新的 r。因为 r.once 不能像您期望的那样工作。

你可以做什么:

    创建一个发出事件的递归函数 使用您在户外活动的数据

这只是一个简单的概念,使用简单的事件,它会在整个时间内触发文件中的数据:

// Your recursive function
var simulateDeviceEvents = function()
  fs.readFile('device.txt', function (err, data) 
    if (err) throw err;
    // Just emit the event here
    Emitter.emit('deviceEvent', data);
  );
  //If this happens to fast you could also call it with
  //a timeout.
  simulateDeviceEvents();
;

// Start the function
simulateDeviceEvents();
//IMPORTANT: The listener must be defined outside your function!
Emitter.on('deviceEvent', function(data)
   // Do something with your data here
);

【讨论】:

感谢您的努力。不幸的是,您的解决方案不适合我想要实现的目标。 fs.readFile 不能使用,因为,整个过程的重点是逐块读取文件(文件太大以将其保存在内存中),并将其作为单个流处理,而无需摸索块组合等......我喜欢使用自定义事件发射器的方法,但即便如此,这个递归函数也需要是我已经使用 fs.createReadStream 的 EventEmmiter。

以上是关于来自文件读取流的Nodejs不定式流的主要内容,如果未能解决你的问题,请参考以下文章

将NodeJS流消耗到缓冲区并写入流的正确方法

nodejs的流总结

文件操作流的存储与读取

java非常好用的读取文件的流的代码

输入流与输出流

java文件流FileOutputStream使用规则换行和追加信息,读取流的信息FileInputStream