时间流中的一个符号与节点

时间:2015-05-12 22:01:49

标签: node.js stream

我正在尝试实现一个流,它在每个'data'事件中从文件返回一个符号。 我完成了以下代码:

var util = require('util'),
    fs = require('fs'),
    Readable = require('stream').Readable;

var util = require('util');
var Readable = require('stream').Readable;

var SymbolReadStream = function(filename, options) {
  Readable.call(this);
  this._readable = fs.createReadStream(filename, options).pause();
  self = this;
  this._readable.on('readable', function() {
    var chunk;
    chunk = self._readable.read(1);
    // I believe the problem is here
    self._readable.pause();
  });
};

util.inherits(SymbolReadStream, Readable); // inherit the prototype methods

SymbolReadStream.prototype._read = function() {
  this._readable.resume();
};

var r = new SymbolReadStream("test.txt", {
  encoding: 'utf8',
});
r.on('data', function(el) {
  console.log(el);
});

但此代码不起作用。请帮忙。 有没有更简单的方法来实现这种行为?

2 个答案:

答案 0 :(得分:3)

This post提供了一个很好的线索,如何回答你的问题。

另外,你应该在pipe采取循环,这将是一种更清洁的方式来完成你想要做的事情:管道适配器到文件流而不是包装起来

那就是说,我不会在这里重新发明轮子,而只是寻找可以实现这一目标的模块。特别是“拆分”模块,使它们分成每个字符,而不是新行。例如,event-stream有一个split方法,“采用与string.split相同的参数,但默认为'\ n'而不是','”。所以逻辑是尝试myStream.pipe(es.split('')),但是模块会像myStream.pipe(es.split())那样在线上打破。所以这是我的解决方案,使用正则表达式“ break on each char

var es = require('event-stream');
var fs = require('fs');

var symbolStream = fs.createReadStream(filename, options).pipe(es.split(/(?!$)/));

编辑:事件流似乎在内部使用split模块,因此您甚至可以尝试

var split = require('split');
var fs = require('fs');

var symbolStream = fs.createReadStream(filename, options).pipe(split(/(?!$)/));

this loose test负责将''转换为\r\n

答案 1 :(得分:1)

在流实现中,没有向处理程序发出'data'事件。因此,with open('urllist.txt', 'r') as urls, open('somefile.txt', 'a') as output: for url in urls: page = requests.get(url.strip()) tree = html.fromstring(page.content) visitors = tree.xpath('//b["no-visitors"]/text()') print 'Visitors: ', visitors print >> output, 'Visitors:', visitors 永远不会被调用。添加事件后,它们将逐个符号流式传输。示例如下:

console.log