Node.js 带节点的时间流中的一个符号

Node.js 带节点的时间流中的一个符号,node.js,stream,Node.js,Stream,我正在尝试实现一个流,它在每个“数据”事件上从文件返回一个符号。 我完成了下面的代码: var util = require('util'), fs = require('fs'), Readable = require('stream').Readable; var util = require('util'); var Readable = require('stream').Readable; var SymbolReadStream = function(filena

我正在尝试实现一个流,它在每个“数据”事件上从文件返回一个符号。 我完成了下面的代码:

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);
});
但是这个代码不起作用。请帮忙。
有没有更简单的方法来实现这种行为

在流实现中,没有向处理程序发出“数据”事件。因此,永远不会调用
console.log
。添加事件后,它们将逐个符号流化。示例如下:

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

function SymbolReadStream(filename, options) {
  if (!(this instanceof SymbolReadStream)) {
    return new SymbolReadStream(length, options);
  }

  Readable.call(this);
  this._readable = fs.createReadStream(filename, options);
}

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

SymbolReadStream.prototype._read = function() {
  var self = this;
  this._readable.on('readable', function() {
    var chunk;
    while (null !== (chunk = self._readable.read(1))) {
      self.emit('data', chunk);
    }
  });
  this._readable.on('end', function() {
    self.emit('end');
  });
};

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

在流实现中,没有向处理程序发出“数据”事件。因此,永远不会调用
console.log
。添加事件后,它们将逐个符号流化。示例如下:

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

function SymbolReadStream(filename, options) {
  if (!(this instanceof SymbolReadStream)) {
    return new SymbolReadStream(length, options);
  }

  Readable.call(this);
  this._readable = fs.createReadStream(filename, options);
}

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

SymbolReadStream.prototype._read = function() {
  var self = this;
  this._readable.on('readable', function() {
    var chunk;
    while (null !== (chunk = self._readable.read(1))) {
      self.emit('data', chunk);
    }
  });
  this._readable.on('end', function() {
    self.emit('end');
  });
};

var r = new SymbolReadStream("test.txt", {
  encoding: 'utf8',
});
r.on('data', function(el) {
  console.log(el);
});
r.on('end', function(el) {
  console.log('done');
});
给出一个很好的答案

此外,您还应该进行循环,这将是一种更干净的方式来完成您试图完成的任务:管道化到文件流的适配器,而不是包装它

也就是说,就个人而言,我不会在这里重新发明轮子,只会搜索能够实现这一点的模块。特别是“拆分”模块,使它们在每个字符上拆分,而不是在新行上拆分。例如,有一个方法“采用与string.split相同的参数,只是默认为“\n”而不是“,”。因此,逻辑应该是尝试
myStream.pipe(es.split(“”))
,但模块采用类似于
myStream.pipe(es.split())
的方法,这会断线。这是我的解决方案,使用正则表达式来表示“每个字符上的中断”


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

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

var symbolStream = fs.createReadStream(filename, options).pipe(split(/(?!$)/));
(负责将
'
转换为
\r\n

给出如何回答问题的好线索

此外,您还应该进行循环,这将是一种更干净的方式来完成您试图完成的任务:管道化到文件流的适配器,而不是包装它

也就是说,就个人而言,我不会在这里重新发明轮子,只会搜索能够实现这一点的模块。特别是“拆分”模块,使它们在每个字符上拆分,而不是在新行上拆分。例如,有一个方法“采用与string.split相同的参数,只是默认为“\n”而不是“,”。因此,逻辑应该是尝试
myStream.pipe(es.split(“”))
,但模块采用类似于
myStream.pipe(es.split())
的方法,这会断线。这是我的解决方案,使用正则表达式来表示“每个字符上的中断”


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

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

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

(负责将
'
转换为
\r\n

这就是我花了一些时间记录的一个。为您提供了一些很棒的文档、3行性能代码,而不是您接受的40行车轮改造。不太公平,因为另一个问题很难,也很耗时。我花了一些时间记录了这个问题。为您提供了一些很棒的文档、3行性能代码,而不是您接受的40行车轮改造。不太公平,因为另一个问题很难,也很耗时。