NodeJS:如何读取(最多)文件中的前N个字节?

时间:2019-11-22 00:45:52

标签: node.js file

在NodeJS中,什么是一种简洁,强大且优雅的方法来读取文件中的前N个字节?

  • 如果数据较少,那么我不希望引发错误。
  • 如果还有更多数据,那么我不希望将其读入内存。

理想情况下,无需安装外部软件包。也许涉及自NodeJS 12以来似乎是新的(非实验性的)异步迭代器?

奖金:我如何阅读前N个字符,并提供特定的编解码器(例如utf-8)?

编辑:根据我的互联网研究,对这个确实相当基本的问题的答案远非显而易见,这就是我要问的原因。我知道如何在其他语言环境中做到这一点,并且对NodeJS生态系统还是陌生的。

2 个答案:

答案 0 :(得分:1)

我认为您需要处理readable streamsread事件。

附加一个处理程序,并与累积的读取值进行比较,检查chunk.length,以确定是否应该继续。

将读取规定的最大值,或考虑文件长度的最小值。

演示让您思考:

const fs = require('fs');
const path = require('path');
const Promise = require('bluebird');

peek(path.resolve('./random/stream.js'), 100, 100)
    .then(result => {
        console.info(result.length);
    });

function peek(filePath, size, max, encoding) {
    return new Promise((resolve, reject) => {
        const stream = fs.createReadStream(filePath, {
            encoding: encoding || 'utf8'
        });

        let length = 0;
        let content = '';
        stream.on('readable', () => {
            let chunk;
            while (length < max && (chunk = stream.read(size)) !== null) {
                length += chunk.length;
                content += chunk.toString();

                if ((length + size) >= max) {
                    size = max - length;
                }
            }

            return resolve({
                length: length,
                content: content
            });
        });
    });
}

答案 1 :(得分:0)

我已经在NodeJS 12(使用TypeScript)中使用以下方法一段时间了:

async function readFirstNBytes(path: fs.PathLike, n: number): Promise<Buffer> {
  const chunks = [];
  for await (let chunk of fs.createReadStream(path, { start: 0, end: n })) {
    chunks.push(chunk);
  }
  return Buffer.concat(chunks);
}