Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 同步地一次读取数据块中的数据_Node.js_Python 3.x_Typescript2.0 - Fatal编程技术网

Node.js 同步地一次读取数据块中的数据

Node.js 同步地一次读取数据块中的数据,node.js,python-3.x,typescript2.0,Node.js,Python 3.x,Typescript2.0,nodejs(typescript)与下面的Python代码片段的等价物是什么?我在Python下面尝试了相应的NodeJ 请注意,我希望一次读取一个块(稍后,也就是说,在本例中,我只是读取第一个千字节),同步读取 另外,我不想一次将整个文件读入虚拟内存;我的一些输入文件(最终)会太大而无法使用 nodejs代码段始终返回null。我想让它返回一个字符串或缓冲区或沿着这些行的东西。如果文件长度>=1024字节,则返回1024个字符,否则返回整个文件 我在谷歌上搜索了一两个小时,但我发现所有的东西

nodejs(typescript)与下面的Python代码片段的等价物是什么?我在Python下面尝试了相应的NodeJ

请注意,我希望一次读取一个块(稍后,也就是说,在本例中,我只是读取第一个千字节),同步读取

另外,我不想一次将整个文件读入虚拟内存;我的一些输入文件(最终)会太大而无法使用

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;
};

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

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

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

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

在EINTR或其他情况下,是否需要在readSync()上循环


我不知道。

首先,流是异步的,所以不能使用文件流同步读取任何内容。如果要同步执行文件I/O,则需要使用
fs.openSync()
fs.readSync()
fs.closeSync()
。如果这是在服务器上下文中完成的,则必须在node.js中异步执行所有I/O,否则会破坏可伸缩性。一个只做一件事的独立脚本可以很好地完成同步文件I/O,但不能作为一个服务器来满足许多请求的需要。如果你展示了你要完成的更大的任务,我们可以向你展示如何使用node.js asynchronous来满足你的任务需求。我真的希望这个程序是同步的——它不容易出现错误,在这种情况下性能不是问题。我是否需要在EINTR或其他情况下循环readSync()?我没有使用协作多任务处理。事实上,我没有使用任何类型的多任务处理。@dstromberg-这能回答你的问题吗?几乎可以。当我在try块中创建fd时,我从tsc中得到一个“TS2304:找不到名称'fd'。@dstromberg-如果您的意思是“将
fd
的定义移到
try
块中”,那么这是意料之中的,因为
finally
子句需要访问它的
fd
必须在更高的范围内定义,以便在使用它的两个地方都可以看到它。如果您的意思不同,我必须查看实际代码才能提供帮助。
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;
}