使用 Node.js 读取文本文件并转换为行数组:同步与异步方案全解(30 seconds of code 实战指南)
教程文档【免费下载链接】30-seconds-of-codeCoding articles to level up your development skills项目地址https://gitcode.com/gh_mirrors/30/30-seconds-of-code点击查看免费下载文本文件的读取与解析是服务端编程中出现频率最高的任务之一。本指南以 30 seconds of code 仓库中的 read-file-lines.md 为骨架系统讲解如何使用 Node.js 内置fs模块同步或异步读取文本文件并通过String.prototype.split()将其转换为字符串行数组。读完本文你将掌握fs.readFileSync()、fs.readFile()、fs/promises的完整用法理解Buffer与编码的关系并能处理换行符跨平台差异等真实工程问题。读取文本文件的两条路径同步 vs 异步Node.js 提供两套读取文件的核心 API选择哪一套取决于你的运行场景fs.readFileSync()同步读取会阻塞事件循环event loop。适用于脚本启动阶段、一次性配置加载等对性能不敏感的场景。fs.readFile()异步读取非阻塞基于回调配合fs/promises下的同名方法则直接返回Promise。适用于 Web 服务器等需要保持高并发响应的场景。从该集合的定位看Node.js 文章集合明确面向Node.js 18.x且所有示例统一使用ESM 语法因此下面的示例均以import方式引入模块。import { readFileSync } from fs; import { readFile } from fs/promises;Buffer 与编码读懂原始返回值两个 API 读取文件后默认返回的都是Buffer对象——这是 Node.js 处理二进制数据的核心类型。要得到可读的文本有两个等价途径调用Buffer.prototype.toString()并可传入编码名称作为参数在调用读取方法时把编码作为第二个参数传入直接返回字符串。readFileSync(test.txt).toString(UTF8); // line1\nline2\nline3\n readFile(test.txt, UTF8); // line1\nline2\nline3\n注意即使指定了编码fs/promises版本的readFile()返回的仍然是一个Promise需要用then或await取回字符串readFile(test.txt).then(data data.toString()); // Promise {line1\nline2\nline3\n} readFile(test.txt, UTF8); // Promise {line1\nline2\nline3\n}编码名称推荐统一写作UTF8等价于utf8Node.js 对大小写不敏感。除 UTF-8 外fs读取还支持ascii、utf16le、latin1、base64、hex等常见编码按文件实际内容选择即可。从文件内容到行数组split 是关键一步拿到文件内容的字符串后将其转换为数组只需要一个 APIString.prototype.split()。文本文件中的行由换行符分隔因此按换行符\n分割即可const fileContents line1\nline2\nline3\n; fileContents.split(\n); // [line1, line2, line3]值得注意的细节是字符串以\n结尾时split(\n)产生的数组中不会包含尾部的空字符串元素line3之后不再有多余的空串。但如果文件内容以换行符开头或存在连续空行数组中将出现空字符串元素这是split的正常行为下文会讨论如何处理。异步读取行数组把“读取”和“分割”两个步骤串联起来即可得到一个返回Promisestring[]的异步函数。注意readFile(path, UTF8)返回的Promise在 resolve 时已经是字符串因此data.split(\n)直接可用import { readFile } from fs/promises; const readFileLines path readFile(path, UTF8).then(data data.split(\n)); readFileLines(test.txt).then(lines console.log(lines)); // [line1, line2, line3]调用方既可以使用Promise.prototype.then()如上也可以在 async 函数内使用awaitconst lines await readFileLines(test.txt); console.log(lines); // [line1, line2, line3]同步读取行数组如果你更偏爱同步代码例如在脚本初始化阶段可以直接使用fs.readFileSync()。此时readFileSync已经通过编码参数返回字符串toString()在此处其实是冗余保险——去掉它结果完全一致但保留可以让意图更明确、也兼容某些返回Buffer的调用写法import { readFileSync } from fs; const readFileLinesSync path readFileSync(path, UTF8).toString().split(\n); const lines readFileLinesSync(test.txt); console.log(lines); // [line1, line2, line3]同步版本的返回值可以直接使用无需处理Promise在顶层模块或函数体内均可直接赋值。真实工程中的边界情况换行符与空行split(\n)假设文件使用 Unix 风格换行LF。但现实中的文本文件可能来自 Windows\r\nCRLF甚至老式 Mac\r。仓库中的 normalize-line-endings.md 专门讨论了这一问题不同操作系统历史上使用不同字符表示换行跨平台处理文本时必须留意。对读取行数组的场景有两种稳妥做法先规范化再分割用String.prototype.replace()配合正则/\r?\n/g把 CRLF 统一为 LF再执行split(\n)const normalizeLineEndings (str, normalized \n) str.replace(/\r?\n/g, normalized); normalizeLineEndings(line1\r\nline2\r\nline3\r\n).split(\n); // [line1, line2, line3]直接按更宽泛的正则分割使用split(/\r?\n/)一条正则同时兼容 LF 与 CRLF是最简洁的跨平台写法。如需兼容极老的\r单独换行可扩展为split(/\r\n|\n|\r/)。另一个常见诉求是过滤空行。若文件中有连续空行或行尾存在多余空白得到的结果数组可能混入空字符串元素可在分割后追加过滤const readFileLinesSync path readFileSync(path, UTF8).split(/\r?\n/).filter(line line.trim() ! );仓库内配套参考读写一体的文件操作闭环30 seconds of code 仓库围绕fs模块提供了成体系的配套方案可与本主题组合成完整的文件操作链路写文件json-to-file.md 展示了fs.writeFileSync()的用法——用JSON.stringify(obj, null, 2)序列化对象后写入.json文件与本文的读取方案正好构成“序列化写入 / 读取解析”的闭环。目录准备create-directory-if-not-exists.md 提供了异步fs.access()fs.mkdir()与同步fs.existsSync()fs.mkdirSync()两种“不存在则创建目录”的实现是读取文件前保障路径可用性的前置步骤。服务端实战nodejs-static-file-server.md 中fs.readFile()被用于实现一个约 70 行的静态文件服务器——它演示了异步读取在真实 I/O 密集场景中的应用每个请求通过回调读取磁盘文件并返回响应同时结合path模块做路径归一化与目录穿越防护。这正是“异步非阻塞读取”价值的典型体现。小结两条路径如何选维度异步readFilefs/promises同步readFileSync返回类型Promisestring指定编码时string事件循环影响非阻塞阻塞错误处理catch或try/awaittry/catch适用场景服务器、并发请求、大文件脚本启动、小配置文件、一次性任务配合String.prototype.split()两种方式都能在数行代码内把文本文件转换为行数组。处理真实文件时请记得结合换行符规范化参考 normalize-line-endings.md与空行过滤就能在绝大多数场景下得到干净、可用的行数据。赞分享教程文档【免费下载链接】30-seconds-of-codeCoding articles to level up your development skills项目地址https://gitcode.com/gh_mirrors/30/30-seconds-of-code点击查看免费下载相关推荐30 seconds of code如何把 NodeList 转换为 JavaScript 数组30 seconds of code如何把 NodeList 转换为 JavaScript 数组 在浏览器端 JavaScript 开发中通过 Docume教程文档在 scikit-opt 里跑通第一个优化问题启发式算法实操在 scikit opt 里跑通第一个优化问题启发式算法实操 scikit opt 把遗传、粒子群、模拟退火、蚁群等 7 种启发式优化算法收进同一套接口你写教程文档30 seconds of codeJavaScript 异步函数组合pipeAsync 与 composeAsync实战指南30 seconds of codeJavaScript 异步函数组合pipeAsync 与 composeAsync实战指南 异步函数组合是函数式编程思教程文档创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

电子信息本科四年规划:嵌入式与芯片方向倒推式学习路线

电子信息本科四年规划:嵌入式与芯片方向倒推式学习路线

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 7:30:44 阅读更多 →
毕业论文怎么降AI?2026年必备教程:5款免费工具盘点与3招人工修改技巧

毕业论文怎么降AI?2026年必备教程:5款免费工具盘点与3招人工修改技巧

学弟学妹们,对着满页飘红的查重报告,看着居高不下的AIGC检测率,是不是瞬间心态失衡?明明熬了好几个通宵敲完的内容,被判定为AI生成,这份委屈实在难平。别着急,降AIGC率远没有想象中复杂&#xf…

2026/10/5 7:30:44 阅读更多 →
SpringBoot+Vue3订单管理系统全栈开发实战解析

SpringBoot+Vue3订单管理系统全栈开发实战解析

洗衣店订单管理系统,听名字是个不起眼的小业务系统,但真把它做扎实了,SpringBootVue3MyBatisMySQL这条前后端分离主链路里的弯弯绕绕基本都能摸一遍。我做这个项目不是为了交差,而是想完整体验一次从需求梳理、数据库设计、后端接…

2026/10/5 7:29:44 阅读更多 →

最新新闻

插件加载失败全解析:从plugins原理到entries did not activate修复

插件加载失败全解析:从plugins原理到entries did not activate修复

搞插件这东西,天天见,但真能把它讲明白的不多。不管是前端工程里的 failed to load plugins web boot ,还是 IDE 里的 IAR plugins,又或者是 MusicFree 的插件机制,背后都是一套相似的设计逻辑。这篇文章不聊虚的&am…

2026/10/5 8:07:59 阅读更多 →
字符串转义与内建函数:跨语言避坑实战指南

字符串转义与内建函数:跨语言避坑实战指南

你有没有遇到过这种情况:打印一个日志,本来想输出C:\temp\new\file.txt,结果终端里却变成了C: emp ew\file.txt?或者从接口拿到一段字符串,想用.做分隔符,split(".")半天切不动,最后才…

2026/10/5 8:07:59 阅读更多 →
Spring Cloud启动双上下文:引导阶段与主启动阶段深度解析

Spring Cloud启动双上下文:引导阶段与主启动阶段深度解析

如果你用 Spring Cloud 搭过微服务,一定见过这种场景:启动日志里环境准备、绑定属性源、加载配置跑了一轮,紧接着又出现一轮 Environment 相关日志,然后才是常见的 Spring Boot 启动横幅和类加载输出。很多人第一反应是“启动过程…

2026/10/5 8:07:59 阅读更多 →
Spring Cloud双上下文详解:引导上下文与主应用上下文的关系与演进

Spring Cloud双上下文详解:引导上下文与主应用上下文的关系与演进

最近“上下文”这三个字在大模型圈子里属实是被说烂了,厂商一个比一个能吹,动辄几十万上百万 token 的上下文窗口。但你要是转到 Java 微服务这边,听到“上下文”还真得先换个思路:在 Spring Cloud 里,上下文指的是 Ap…

2026/10/5 8:07:59 阅读更多 →
5.java-数组

5.java-数组

概念 数组介绍:相同类型的数据按照一定顺序排列的集合。数组也是一组数据类型,是引用类型。数组在内存中以连续的内存块进行存储。 数组的长度: arr.length,数组最后位是arr[arr.length-1] 定义与初始化 定义数据类型 数组名[] new 数据类型…

2026/10/5 8:07:58 阅读更多 →
TDengine与Thingsboard集成实战:三条路线与踩坑指南

TDengine与Thingsboard集成实战:三条路线与踩坑指南

开头先交代一下背景。TDengine和Thingsboard这对组合,我在实际项目里已经用过不止一次。TDengine是面向物联网场景的时序数据库,写入快、压缩率高、天生按时间线组织数据;Thingsboard则是开源物联网平台,负责设备接入、规则链转发…

2026/10/5 8:06:58 阅读更多 →

日新闻

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 0:00:22 阅读更多 →
AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

1. 从“plugins”这个词说起:它到底在解决什么问题如果你最近在折腾 AI 编程工具,尤其是 Cursor、Codex CLI、Claude Code 这类带 CLI 的编辑器或命令行助手,那你大概率绕不开一个词——plugins。这个词本身不新鲜,从浏览器到 IDE…

2026/10/5 0:00:23 阅读更多 →
第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 0:00:23 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 5:06:42 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 1:10:22 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 3:06:17 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 11:40:45 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 9:43:54 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 20:14:29 阅读更多 →