首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >以同步方式一次读取一个数据块

以同步方式一次读取一个数据块
EN

Stack Overflow用户
提问于 2018-06-26 07:05:35
回答 1查看 544关注 0票数 0

下面的Python代码片段对应的nodejs (typescript)是什么?我在Python下面尝试了相应的nodejs。

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

而且,我不想一次将整个文件读入虚拟内存;我的一些输入文件(最终)对于虚拟内存来说太大了。

nodejs代码片段总是返回null。我希望它沿着这些行返回一个字符串或缓冲区或其他东西。如果文件是1024字节长的>=,我想要1024字符长的返回值,否则我想要整个文件。

我在谷歌上搜索了一两个小时,但我发现的是同步地一次读取整个文件,或者一次异步地读取片断。

谢谢!

这是Python:

代码语言:javascript
复制
def readPrefix(filename: str) -> str:
    with open(filename, 'rb') as infile:
        data = infile.read(1024)
    return data

下面是nodejs尝试:

代码语言:javascript
复制
const readPrefix = (filename: string): string => {
    const readStream = fs.createReadStream(filename, { highWaterMark: 1024 });
    const data = readStream.read(1024);
    readStream.close();

    return data;
};
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-26 08:42:39

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

下面是一些常规的Javascript代码(希望您可以将其转换为TypeScript),它同步地从文件中读取一定数量的字节,并返回一个包含这些字节的buffer对象(或者在出错的情况下抛出异常):

代码语言:javascript
复制
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作为要读取的字节,如果文件中的字节数少于1024,它将一直读取到文件的末尾。返回缓冲区对象将包含读取的字节,您可以将其作为二进制访问或转换为字符串。

为了便于其他人阅读本文,我在前面的评论中提到,永远不应该在服务器环境中使用同步I/O (服务器应该始终使用异步I/O,除非是在启动时)。同步I/O可用于只做一件事的独立脚本(例如构建脚本),而不需要响应多个传入的请求。

我是否需要在EINTR或其他情况下对readSync()进行循环?

据我所知没有。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51032857

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档