使用 Node.js 就地流式传输和转换文件

2024-04-28

我想做这样的事情:

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

var file = 'path/to/file.json';

var input = fs.createReadStream(file, 'utf8');
var output = fs.createWriteStream(file, 'utf8');

var buf = '';
input
.pipe(through(function data(chunk) { buf += chunk; }, function end() {
  var data = JSON.parse(buf);
  // Do some transformation on the obj, and then...
  this.queue(JSON.stringify(data, null, ' '));
})
.pipe(output);

但这会失败,因为它试图读取和写入同一目的地。有很多方法可以解决这个问题,比如只通过管道output从内部end上面回调。

有没有更好的办法?我所说的更好是指使用更少的代码或更少的内存。是的,我知道我可以这样做:

var fs = require('fs');
var file = 'path/to/file.json';

var str = fs.readFileSync(file, 'utf8');
var data = JSON.parse(str);    
// Do some transformation on the obj, and then...
fs.writeFileSync(file, JSON.stringify(data, null, '  '), 'utf8');

您的代码没有其他方法可以使用less内存,因为您需要整个文件才能将其解析为 Javascript 对象。这样,两个版本的代码在内存方面是等效的。如果您无需处理完整的 JSON 对象就可以完成一些工作,请查看JSON流 https://github.com/dominictarr/JSONStream.

在你的例子中,你should读取文件,然后对其进行解析和转换,然后将结果写入文件;尽管您不应该使用函数的同步版本,但请参阅Node.js 文档本段的末尾 http://nodejs.org/api/fs.html#fs_file_system:

在繁忙的进程中,强烈鼓励程序员使用这些调用的异步版本。同步版本将阻止整个过程,直到完成为止——停止所有连接。


无论如何,我认为您在覆盖文件时无法读取文件。看这个特定的答案 https://stackoverflow.com/a/10586706/2137601同样的问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Node.js 就地流式传输和转换文件 的相关文章

随机推荐

  • Python 滚动文本模块

    我想使用scrolledtext模块创建一个ScrolledText小部件 以便在python中创建GUI 我已经成功创建了 ScrolledText 小部件 但是我无法向其添加水平滚动条 e3 ScrolledText window3 w
  • 如何在 laravel 中插入多类别和多列不同类别的帖子?

    大家好 我是一个新的 Laravel 我的项目有问题 我有2张桌子 posts id title category id category id name PHP Laravel Ruby 例如 我想要的结果是 如果我将帖子插入帖子数据库
  • 我无法在 Unity Hub 中激活许可证

    我重新安装了视窗 10 我从官方网站下载了 Unity Hub 运行 unity hub 我看到错误 您没有有效的许可证 错误上有 2 个按钮 管理许可证 和 关闭 我单击 管理许可证 进入 Unity 中心设置中的 许可证管理 页面 单击
  • Java 泛型和数组初始化

    下面这句话的解释是什么 public class GenericsTest statement 1 public ArrayList
  • 如何对 Spring Boot MongoRepository 进行单元测试?

    在我的 Spring Boot Web 应用程序中 我使用 MongoDB 来存储数据 在应用程序中 我使用扩展的接口访问数据库MongoRepository 如何为这样的存储库类设置单元测试 我想要的是 启动 MongoDB 的嵌入式 内
  • 在 Mac OS X 上安装 Crypto++ 5.6.2

    我正在尝试在我的 Mac 上安装 Crypto 5 6 2 当我跑步时 make j4 libcryptopp a 我收到以下错误 libtool unrecognized option static libtool Try libtool
  • 预渲染 vue.js 2.0 组件(类似于 vue 1 中的 this.$compile)

    我正在努力使可重复使用的组件网格堆栈 https github com troolee gridstack js 我找不到一种简单的方法来做类似的事情this compile方法来自vue 1 我见过这个example http codep
  • 在我的例子中以编程方式安装 X509 证书

    我正在开发一个Android项目 我有一个 PEM 证书字符串 BEGIN CERTIFICATE MIIEczCCA1ugAwIBAgIBADANBgkqhkiG9w0BAQQFAD AkGA1UEBhMCR0Ix EzARBgNVBAg
  • 使用不同数据集重新加载和重新启动状态机的正确方法

    我需要相同的 SM 来服务同一数据库表中的各种记录 无法为每个记录创建 SM 这是使用另一条记录中的新状态重新初始化 SM 的合适方法吗 或者您能建议更好的方法吗 public static
  • 如何知道 Android TalkBack 是否处于活动状态?

    我正在开发一个使用 TalkBack 来指导人们完成的应用程序 然而 在这些情况下 我希望应用程序的布局有一些细微的差异 以便导航更容易 并且还有额外的语音输出 使用 TextToSpeech 来帮助指导用户 我的问题是 如果用户激活了 T
  • 使用Qt设置http get请求参数

    我正在 Qt 中开发一个基本应用程序 它使用 REST API 从 Parse com 检索数据 我浏览了一些类参考和 cURL 手册 但仍然不清楚如何设置请求参数 例如 我想对用户进行身份验证 这是 Parse 提供的curl 示例 cu
  • 外部类调用内部类的方法

    我知道要实例化成员内部类 您有两个不同的构造函数 First Outer out new Outer Outer Inner in out new Inner Second Outer Inner in new Outer new Inne
  • 间歇性的“事件循环在 Future 完成之前停止。”

    我一直在为这个问题抓狂 有问题的代码是此处开源项目的一部分 aiosmtpd https github com pepoluan aiosmtpd 我的实际 FOSS 项目的分支 here https github com aio libs
  • Python 文档的 reStructuredText 有真正的替代品吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我很快就要开始一个开源 Python 项目 并且我试图提前决定如何编写我的文档字符串 显而易见的答案是
  • php ftp 检查文件夹是否存在总是返回创建文件夹错误

    有人可以告诉我这段代码中做错了什么吗 if id if is dir public html tem pasta path pics id echo pasta j existia destination file public html
  • jnius 1.1导入错误

    当我想导入 jnius 时出现如下错误 Traceback most recent call last File C Python27 lib site packages jnius init py line 12 in
  • 使用 oauth azure 数据工厂进行分页

    在 Azure 数据工厂内 我通过 REST 复制活动调用 microsoft graph 利用 REST 来获取服务的访问令牌 Graph api 最多返回 200 个结果 因此我有兴趣使用可以在源中创建的分页规则 在邮递员中我可以看到我
  • window.location 的 .NET MVC jQuery 相对路径

    我有一个非常简单的问题 但似乎无法弄清楚 由于 MVC 构建 URL 的方式 它包括所有路由信息 以下内容不起作用 我希望路径名仅返回虚拟目录路径 我所做的只是当用户从下拉列表中选择 ID 时重定向到不同的路由 document ready
  • axios 拦截器内的 useContext

    我不明白为什么我的 useContext 没有在这个函数中被调用 import useContext from react import MyContext from contexts MyContext js import axios f
  • 使用 Node.js 就地流式传输和转换文件

    我想做这样的事情 var fs require fs var through require through var file path to file json var input fs createReadStream file utf