【问题标题】:node.js - the best way to replace content in buffernode.js - 替换缓冲区内容的最佳方法
【发布时间】:2013-08-19 12:37:59
【问题描述】:

我正在读取一个要缓冲的文件,例如:

var myfile = fs.readFileSync(myfile.txt);

myfile 缓冲区中将某些字符串替换为另一个字符串的正确方法是什么?我想将其保留为缓冲区,因为它比将其保留为字符串要快。

【问题讨论】:

标签: node.js buffer


【解决方案1】:

buffer-replace https://www.npmjs.com/package/buffer-replace 包替换缓冲区中的内容,就像 String 的函数 replace 一样。

【讨论】:

    【解决方案2】:

    如果将abcdef 替换为ghi 会发生什么情况。它会在缓冲区中留下一个洞,因为缓冲区无法调整大小。您至少可以在 Buffer 中搜索字符串并创建另一个输出 Buffer 替换字符串(可能需要中间缓冲区)。

    JavaScript 的字符串替换以这种方式有效地处理字符串。如果您仍想使用 Buffers,可以查看buffertools。它具有indexOf 函数,可在缓冲区中搜索字符串。 replace 是你必须自己实现的东西。

    【讨论】:

    • 是的。但这与我无关。在缓冲区中留下一个洞比重写它更好。
    • @FlashThunder 如果您希望将 ghi 替换为 abcdef 怎么办?
    • 嗯,在我的情况下,我想替换的东西是由我定义的......所以我可以根据需要制作它。但当然,你是对的。唯一的方法似乎是制作一个巨大的缓冲区并完全重写它。似乎仍然比字符串化更快。
    • @FlashThunder 我怀疑你会用缓冲区获得更快的结果。只有当您必须读取/写入大量数据时,缓冲区才会更快,例如处理二进​​制数据的套接字。字符串针对此类操作进行了更好的优化。您应该将数据存储为字符串而不是缓冲区。看到这个问题:stackoverflow.com/questions/4901570/….
    • 在我的例子中,一个这样的缓冲区是 > 2MB
    【解决方案3】:

    不幸的是,缓冲区处理原始二进制数据。它不提供与字符串相关的功能。

    据我所知,你必须先将其转换为字符串(toString() 方法),然后再搜索和替换里面的字符串。

    如果您知道搜索字符串的索引,则可以将索引前后的缓冲区内容复制到新缓冲区中,并将替换的内容连接起来。 但在这种情况下,你会遇到编码问题……

    缓冲区文档:http://nodejs.org/api/buffer.html#buffer_class_buffer

    【讨论】:

    • 嗯...这有点烦人,因为将缓冲区切换到字符串并返回会占用大量资源,尤其是当缓冲区很大时。从位置 0 开始并以 buffer.length - chunk.length 结尾的块读取缓冲区不是更好吗,其中块大小与搜索字符串的大小相同,然后逐字节替换?会不会更快,尤其是当找到字符串并且我们只替换一次时?
    • 我猜您正在使用缓冲区,因为您的数据是流式传输的。在这种情况下,我建议您逐个处理它,并使用缓冲区工具作为 user568109 提到的,并像您所说的那样“打洞”,这没有问题。但是也许您可以提供有关您的案例的更多详细信息并获得更准确的建议。
    猜你喜欢
    • 2014-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多