一次同步读取一个数据块

时间:2018-06-25 23:05:35

标签: node.js python-3.x typescript2.0

以下Python代码段的nodejs(打字稿)等效项是什么?我已经尝试了在Python下方的相应的nodejs。

请注意,我想一次同步读取一次块(后来,在此示例中,我只是读取第一个千字节)。

此外,我不想一次将整个文件读入虚拟内存;为此,我的一些输入文件将(最终)太大。

nodejs代码段始终返回null。我希望它返回字符串或缓冲区或类似的东西。如果文件的长度> = 1024字节,则我希望返回1024个字符,否则,我需要整个文件。

我用谷歌搜索了一个小时或两个小时,但发现的全部是一次同步读取整个文件或一次异步读取碎片的事情。

谢谢!

这是Python:

def readPrefix(filename: str) -> str:
    with open(filename, 'rb') as infile:
        data = infile.read(1024)
    return data

这是nodejs的尝试:

const readPrefix = (filename: string): string => {
    const readStream = fs.createReadStream(filename, { highWaterMark: 1024 });
    const data = readStream.read(1024);
    readStream.close();

    return data;
};

1 个答案:

答案 0 :(得分:1)

要同步阅读,您可以使用fs.openSync()fs.readSync()fs.closeSync()

以下是一些常规Javascript代码(希望您可以将其转换为TypeScript),该代码可以从文件中同步读取一定数量的字节,并返回包含这些字节的缓冲区对象(或在发生错误的情况下引发异常):

const fs = require('fs');

function readBytesSync(filePath, filePosition, numBytesToRead) {
    const buf = Buffer.alloc(numBytesToRead, 0);
    let fd;

    try {
        fd = fs.openSync(filePath, "r");
        fs.readSync(fd, buf, 0, numBytesToRead, filePosition);
    } finally {
        if (fd) {
            fs.closeSync(fd);
        }
    }
    return buf;
}

对于您的应用程序,您可以只传递1024作为要读取的字节,如果文件中的字节数少于该字节,它将一直读取直到文件末尾。返回缓冲区对象将包含读取的字节,您可以将其作为二进制进行访问或转换为字符串。

为了使其他读者受益,我在前面的评论中提到过,同步I / O绝对不能在服务器环境中使用(服务器应该始终使用异步I / O,除非在启动时)。同步I / O可用于仅做一件事的独立脚本(例如,构建脚本),而无需响应多个传入请求。

  

如果需要EINTR或其他功能,是否需要在readSync()上循环?

不是我所知道的。