【问题标题】:How to read large binary files in node js without a blocking loop?如何在没有阻塞循环的情况下读取节点 js 中的大型二进制文件?
【发布时间】:2016-07-08 13:50:13
【问题描述】:

我正在尝试学习一些事件驱动编程的基础知识。因此,对于一个练习,我正在尝试编写一个程序来读取一个大的二进制文件并用它做一些事情,但没有进行阻塞调用。我想出了以下几点:

var fs = require('fs');
var BUFFER_SIZE = 1024;
var path_of_file = "somefile"

fs.open(path_of_file, 'r', (error_opening_file, fd) =>
{
    if (error_opening_file)
    {
        console.log(error_opening_file.message);
        return;
    }

    var buffer = new Buffer(BUFFER_SIZE);
    fs.read(fd, buffer, 0, BUFFER_SIZE, 0, (error_reading_file, bytesRead, buffer) =>
    {
        if (error_reading_file)
        {
            console.log(error_reading_file.message);
            return;
        }

        // do something e.g. print or write to another file
    })
})

我知道我需要放置一个 while 循环才能读取完整的文件,但在上面的代码中,我只读取文件的前 1024 个字节,无法制定如何在不使用阻塞循环的情况下继续读取文件。我们该怎么做?

【问题讨论】:

    标签: node.js event-driven event-driven-design


    【解决方案1】:

    请改用fs.createReadStream。这将一遍又一遍地调用你的回调,直到它完成读取文件,所以你不必阻塞。

    var fs = require('fs');
    
    var readStream = fs.createReadStream('./test.exe');
    readStream.on('data', function (chunk) {
      console.log(chunk.length);
    })
    

    【讨论】:

    • 嘿 rgvassar 感谢您的回复。它在一次调用中读取了多少数据?这个函数不是在内存中获取完整的文件吗?不是只读取文本文件吗?
    • 我错了readFile 一口气读取了整个文件。我已经编辑了我的答案以使用createReadStream,它将传回块。每个块是 65536 字节。 readFilecreateReadStream 都不限于文本文件。他们可以读取任何类型的文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-07
    • 1970-01-01
    • 2011-01-22
    • 1970-01-01
    • 2019-09-12
    • 2016-12-20
    • 2017-11-13
    相关资源
    最近更新 更多