ES6 使用 NodeJS 逐行读取文件内容

本文介绍如何在ES6环境下使用NodeJS逐行读取文件内容,包括目录结构、代码实现及测试结果。通过使用Proxy观察者模式更新对象属性,以及readline模块读取文件,最后通过babel转换为ES5代码以确保兼容性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

请参考:
ES5 使用 NodeJS 逐行读取文件的内容
简单搭建 ES6 的运行环境

在 ES6 中使用 NodeJS 实现逐行读取文件内容,具体代码实现如下:

先看一下目录结构:
在这里插入图片描述

//ObserverMode.js

const queuedObservers = new Set();

const observe = fn => queuedObservers.add(fn);
const observable = obj => new Proxy(obj, {set});

function set(target, key, value, receiver) {
    const result = Reflect.set(target, key, value, receiver);
    queuedObservers.forEach(observer => observer());
    return result;
}

const person = observable({
    name: '张三',
    age: 20
});

function print() {
    console.log(`${person.name}, ${person.age}`)
}

observe(print);
person.name = '李四';
//readFileByLine.js
import fs from "fs";
import readLine from "readline";

const init = Symbol("init");
const readObj = Symbol("readObj");

class ReadFileByLine {

    constructor(file) {
        this.file = file;
    }

    read(cb) {
        this[init]();

        this[readObj].on("line", cb);

        this[readObj].on("close", () => {
            console.log("readLine closed ....");
        });
    }

    //私有方法
    [init]() {
        //私有变量
        this[readObj] = readLine.createInterface({
            input: fs.createReadStream(this.file)
        });
    }
}

export default ReadFileByLine;

测试代码如下:

//readMyFile.js
import ReadFileByLine from "./readFileByLine";

const readFileByLine = new ReadFileByLine("ObserverMode.js");
let idx = 0;
readFileByLine.read((line) => {
    var out = "line_" + idx + ": " + line.toString();
    console.log(out);
});

通过使用 babel 将 ES6 转码成 ES5 之后,就可以正常运行了。

转码之后的代码如下:

//readFileByLine.js
"use strict";

Object.defineProperty(exports, "__esModule", {
    value: true
});

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); 
var _fs = require("fs");

var _fs2 = _interopRequireDefault(_fs);

var _readline = require("readline");

var _readline2 = _interopRequireDefault(_readline);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

var init = Symbol("init");
var readObj = Symbol("readObj");

var ReadFileByLine = function () {
    function ReadFileByLine(file) {
        _classCallCheck(this, ReadFileByLine);

        this.file = file;
    }

    _createClass(ReadFileByLine, [{
        key: "read",
        value: function read(cb) {
            this[init]();

            this[readObj].on("line", cb);

            this[readObj].on("close", function () {
                console.log("readLine closed ....");
            });
        }

        //私有方法

    }, {
        key: init,
        value: function value() {
            //私有变量
            this[readObj] = _readline2.default.createInterface({
                input: _fs2.default.createReadStream(this.file)
            });
        }
    }]);

    return ReadFileByLine;
}();

exports.default = ReadFileByLine;
//readMyFile.js
"use strict";

var _readFileByLine = require("./readFileByLine");

var _readFileByLine2 = _interopRequireDefault(_readFileByLine);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

var readFileByLine = new _readFileByLine2.default("ObserverMode.js");
var idx = 0;
readFileByLine.read(function (line) {
    var out = "line_" + idx + ": " + line.toString();
    console.log(out);
});

测试结果如下:

"D:\software\WebStorm 2017.2.4\bin\runnerw.exe" "D:\Program Files\nodejs\node.exe" D:\Workspaces\Webstorm\web\javascript\ES6\out\readMyFile.js
line_0: 'use strict';
line_0: 
line_0: var queuedObservers = new Set();
line_0: 
line_0: var observe = function observe(fn) {
line_0:     return queuedObservers.add(fn);
line_0: };
line_0: var observable = function observable(obj) {
line_0:     return new Proxy(obj, { set: set });
line_0: };
line_0: 
line_0: function set(target, key, value, receiver) {
line_0:     var result = Reflect.set(target, key, value, receiver);
line_0:     queuedObservers.forEach(function (observer) {
line_0:         return observer();
line_0:     });
line_0:     return result;
line_0: }
line_0: 
line_0: var person = observable({
line_0:     name: '张三',
line_0:     age: 20
line_0: });
line_0: 
line_0: function print() {
line_0:     console.log(person.name + ', ' + person.age);
line_0: }
line_0: 
line_0: observe(print);
line_0: person.name = '李四';
readLine closed ....

Process finished with exit code 0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值