Node.js readline 缺少文件的最后一行?

Posted

技术标签:

【中文标题】Node.js readline 缺少文件的最后一行?【英文标题】:Node.js readline missing last line of file? 【发布时间】:2013-08-29 07:13:33 【问题描述】:

我正在尝试在 Node.js 下异步逐行读取文本文件。我有以下 CoffeeScript 代码:

readline  = require 'readline'
fs        = require 'fs'

#--------------------------------------------------------------------
lines_of = ( route, handler ) ->
  #..................................................................
  stream = readline.createInterface
    input:    fs.createReadStream route
    output:   process.stdout
    terminal: false
  #..................................................................
  stream.on 'close', ->
    handler null, null
  #..................................................................
  stream.on 'error', ( error ) ->
    handler error
  #..................................................................
  stream.on 'line', ( line ) ->
    handler null, line

它工作正常,除了最后一行文件不会被报告,除非它被换行符终止。有什么办法可以解决这个问题(当然,除了手动添加换行符)?

【问题讨论】:

简单的解决方案,如果文件不是太大:也许只使用readFile并在\n上拆分? 是的,这绝对不是 readline 的用途。如果您正在制作 shell 或 REPL,您将使用 readline,而不是用于读取文件。你想要fs 模块:nodejs.org/api/fs.html 你的评论让我觉得既正确又在技术上存在争议——毕竟,“黑客”就是在适当的地方使用工具。更重要的是:流抽象告诉您查看的不是那么多文件、http 请求和标准输入键盘事件,而是“数据流”。也就是说,如果 readline 没有办法传达“悬空位”(在换行之前,但在输入流完成之后),那么它是它的 API,而不是它的 预期目的 这使得这个库不适合手头的任务。 @WiredPrairie:是的,这对于小文件来说是一个很好的解决方案,但我需要读取数万行的文件。处理逻辑和处理速度都受益于异步方式。 所以,答案是“不”,没有办法使用您选择的 API 来解决这个问题。您需要找到另一个模块或编写进行逐行处理所需的几行代码。 【参考方案1】:

您应该为此使用fs 模块,并在\n 字符上拆分文件内容以确定行结束的位置。

【讨论】:

读取文件内容?如果文件大小是 50G 而你的 RAM 是 4G 怎么办?【参考方案2】:

似乎从 0.12.2 https://github.com/nodejs/node-v0.x-archive/issues/7238 开始修复

【讨论】:

以上是关于Node.js readline 缺少文件的最后一行?的主要内容,如果未能解决你的问题,请参考以下文章

在关闭事件时从 node.js readline 模块返回数组

Node.js实现终端输入(readline模块)

Node.js承诺中的readline

Node.JS 文件读写,把Sheet图集转换为龙骨动画图集

我们如何在(Node.js 8. 目前)上的 readline.on 函数下使用 promise

带有 Passport 的 Node.js 身份验证:如果缺少字段,如何闪烁消息?