File size: 3,444 Bytes
cee4ba4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
const fs = require('fs');
const path = require('path');
const os = require('os');
const EventEmitter = require('events');
const { pipeline } = require('stream');
const { promisify } = require('util');

const pipelineAsync = promisify(pipeline);

/**
 * Node.js 核心 API 演示模块
 * 展示: fs, path, stream, os, events, util
 */
class CoreApiDemo extends EventEmitter {
    constructor(dataDir) {
        super();
        this.dataDir = dataDir;
        this.demoFile = path.join(dataDir, 'core_demo.txt');
        this.copyFile = path.join(dataDir, 'core_demo_copy.txt');
    }

    async run() {
        console.log('--- 开始 Node.js 核心 API 演示 ---');

        try {
            // 1. Path 模块演示
            this.demoPath();

            // 2. OS 模块演示
            this.demoOs();

            // 3. Events 模块演示
            this.demoEvents();

            // 4. FS & Stream 模块演示
            await this.demoFsAndStream();

        } catch (err) {
            console.error('核心 API 演示出错:', err);
        }
        
        console.log('--- 核心 API 演示结束 ---');
    }

    demoPath() {
        console.log('\n[Path 模块]');
        console.log(`__dirname: ${__dirname}`);
        console.log(`文件名 (basename): ${path.basename(this.demoFile)}`);
        console.log(`扩展名 (extname): ${path.extname(this.demoFile)}`);
        console.log(`解析路径 (parse):`, path.parse(this.demoFile));
    }

    demoOs() {
        console.log('\n[OS 模块]');
        console.log(`平台: ${os.platform()} (${os.arch()})`);
        console.log(`主机名: ${os.hostname()}`);
        console.log(`总内存: ${(os.totalmem() / 1024 / 1024 / 1024).toFixed(2)} GB`);
        console.log(`空闲内存: ${(os.freemem() / 1024 / 1024 / 1024).toFixed(2)} GB`);
        console.log(`CPU核数: ${os.cpus().length}`);
    }

    demoEvents() {
        console.log('\n[Events 模块]');
        console.log('注册自定义事件 "hello"...');
        
        // 监听一次性事件
        this.once('hello', (data) => {
            console.log(`触发了 "hello" 事件,数据: ${JSON.stringify(data)}`);
        });

        // 触发事件
        this.emit('hello', { msg: 'Node.js is cool!', timestamp: Date.now() });
    }

    async demoFsAndStream() {
        console.log('\n[FS & Stream 模块]');
        
        // FS: 写入文件
        const content = 'Hello Node.js Core APIs!\nThis is a test file for streams.\n' + new Date().toISOString();
        console.log(`写入文件: ${this.demoFile}`);
        fs.writeFileSync(this.demoFile, content);

        // FS: 获取文件状态
        const stats = fs.statSync(this.demoFile);
        console.log(`文件大小: ${stats.size} bytes`);
        console.log(`创建时间: ${stats.birthtime}`);

        // Stream: 流式复制文件
        console.log(`使用 Stream Pipeline 复制文件到: ${this.copyFile}`);
        
        await pipelineAsync(
            fs.createReadStream(this.demoFile),
            fs.createWriteStream(this.copyFile)
        );
        
        console.log('文件复制完成 (Stream pipeline)');

        // FS: 读取复制后的文件验证
        const copiedContent = fs.readFileSync(this.copyFile, 'utf8');
        console.log('读取复制文件内容前 50 字符:', copiedContent.substring(0, 50).replace(/\n/g, '\\n') + '...');
    }
}

module.exports = CoreApiDemo;