当前位置: 首页 > 面试题库 >

如何关闭可读流(结束之前)?

丁慈
2023-03-14
问题内容

如何在Node.js中关闭可读流?

var input = fs.createReadStream('lines.txt');

input.on('data', function(data) {
   // after closing the stream, this will not
   // be called again

   if (gotFirstLine) {
      // close this stream and continue the
      // instructions from this if
      console.log("Closed.");
   }
});

这会比以下更好:

input.on('data', function(data) {
   if (isEnded) { return; }

   if (gotFirstLine) {
      isEnded = true;
      console.log("Closed.");
   }
});

但这不会停止阅读过程…


问题答案:

调用input.close()。它不在文档中,但是

https://github.com/joyent/node/blob/cfcb1de130867197cbc9c6012b7e84e08e53d032/lib/fs.js#L1597-L1620

显然可以完成这项工作:)它实际上所做的事情与您的相似isEnded

EDIT 2015-Apr-19 根据以下评论,并进行澄清和更新:

  • 此建议是骇客行为,没有记录在案。
  • 尽管从目前lib/fs.js来看,它仍然可以在> 1.5年后使用。
  • 我同意以下有关称呼destroy()更好的评论。
  • 如以下正确所述,这适用于fs ReadStreams,而不适用于通用Readable

至于通用解决方案:至少从我对文档的理解和快速浏览来看,它似乎并不存在_stream_readable.js

我的建议是将您的可读流置于 暂停
模式,至少防止上游数据源中的进一步处理。如文档中所述,不要忘记unpipe()并删除所有data事件监听器,以便pause()实际上暂停



 类似资料:
  • 我正在窗口流上执行聚合,希望抑制早期聚合结果。我所说的早期结果是指在窗口结束前计算的结果,而不是那些在宽限期内发生的结果。因此,我想用时间戳抑制所有聚合结果 最小Kafka流拓扑示例: 因此,不是我的选择,因为我必须等到宽限期到期,这可能会很长。 根据KIP-328,使用

  • 问题内容: 我想知道如果不手动关闭流,何时关闭。我的意思是,如果引用的范围不再存在,流将被关闭吗? 请考虑以下示例方案。 在这里,一旦完成流处理,我将退出,但是反过来将继续执行该程序的程序不会终止,而是继续进行其他操作。 我没有关闭溪流。一旦对A类的引用范围结束,它会自动关闭吗?(即何时结束)?GC会照顾吗?另外,我读到,一旦流程结束,流将关闭,并且系统释放为其他进程保留的所有资源。我们如何检查流

  • 是否有任何soundio函数可以“关闭”或“停止”? (我可能会根据回答编辑或添加我的问题,现在我有太多的未知数,无法提出正确的问题。)

  • 我正在接受LazyInitializationException错误,因为在myController中,当我读取Lazy collections会话时,该会话已经关闭。只要有请求,有没有办法打开它?作为OpenSessionInView?最好的方法是什么? 我使用的是Spring Boot 1.3.0版本

  • 在使用Hibernate和Jpa的spring boot应用程序中,我需要在saveAll()之前关闭select,以提高高记录数的性能。 我找到了一个使用JPQL的方法,性能很好(在30s内删除+保存10k条记录),但我希望继续使用hibernate和JPA。 我的期望是,当我运行用Java编写的代码时,我必须删除一个表的所有记录,然后保存另一个表的所有记录。当我以经典的方式(deleteAll

  • 我想做的是:打开大文件的InputStream,读取10MB的块,上传一个块,读取下一个块。 我为这个任务编写了很好的代码,但问题是ContentResolver返回ParcelFileDescriptor。AutoCloseInputStream作为InputStriam。这个实现打破了InputStream的契约,因为它在first.read()之后自动关闭,所以当我尝试读取下一个块时,我得到