diff --git "a/\345\255\231\351\271\255\347\277\224/20260316-\350\257\276\345\240\202\347\254\224\350\256\260.md.txt" "b/\345\255\231\351\271\255\347\277\224/20260316-\350\257\276\345\240\202\347\254\224\350\256\260.md.txt" new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git "a/\345\255\231\351\271\255\347\277\224/20260318-\350\257\276\345\240\202\347\254\224\350\256\260.md" "b/\345\255\231\351\271\255\347\277\224/20260318-\350\257\276\345\240\202\347\254\224\350\256\260.md" new file mode 100644 index 0000000000000000000000000000000000000000..a5a6b38f5814eb57d7f597f5f3f9d8eb9c3e60f8 --- /dev/null +++ "b/\345\255\231\351\271\255\347\277\224/20260318-\350\257\276\345\240\202\347\254\224\350\256\260.md" @@ -0,0 +1,97 @@ +1. 请解释同步方法和异步方法的区别 +同步方法和异步方法的主要区别在于‌执行方式、阻塞性质和适用场景‌。 + - 1. 执行方式‌ +‌同步方法‌:调用者必须等待方法执行完成之后才能继续后续操作。方法调用是‌顺序执行‌的,一个任务完成后,下一个任务才能开始。 +‌异步方法‌:调用者在发起调用后不会阻塞,方法会在后台执行,调用者可以继续执行其他任务。通常通过回调、事件或异步通知机制处理结果。 + - 2. 阻塞性质‌ +‌同步方法‌:具有‌阻塞特性‌,在方法执行期间,调用线程会被挂起,直到方法返回结果。 +‌异步方法‌:‌非阻塞‌,调用者不需要等待方法执行完毕,可以继续执行其他操作。 + - 3. 适用场景‌ +‌同步方法‌:适用于逻辑简单、顺序执行的场景,尤其在需要保证数据一致性和顺序性时,如数据库事务处理。 +‌异步方法‌:适用于高并发、I/O密集型任务,如网络请求、文件读写、数据库查询等,能提高程序效率。 + - 4. 性能与复杂度‌ +‌同步方法‌:虽然逻辑清晰、易于调试,但在等待资源时可能造成性能瓶颈。 +‌异步方法‌:虽然效率更高,但代码结构更复杂,需要处理线程安全、回调机制等问题。 + - 5.举例说明‌ +‌同步方法‌:比如在银行柜台办理业务,必须等前一个人办完才能轮到你。 +‌异步方法‌:比如在网上购物下单,支付完成后你不需要等待商品送达,可以继续做其他事情。 +总结来说,同步方法强调顺序性和安全性,而异步方法强调效率和并发性。 +2. fs.readFile和fs.readFileSync有什么区别? +- 1. ‌执行方式‌ +‌fs.readFile‌ 是一个‌异步‌方法。它不会阻塞程序的执行,当文件读取完成时,通过回调函数返回结果。这种方式适合处理大型文件或需要同时执行其他操作的场景。 +‌fs.readFileSync‌ 是一个‌同步‌方法。它会阻塞程序的执行,直到文件读取完成才会继续执行后续代码。这种方式适用于对执行顺序有严格要求、非高并发的场景。 +- 2. ‌阻塞性质‌ +‌fs.readFile‌ 是非阻塞的。调用后,程序会继续执行下一行代码,不会等待文件读取完成。 +‌fs.readFileSync‌ 是阻塞的。在文件读取完成之前,程序会暂停执行,这可能会导致性能问题,尤其是在读取大文件或高并发场景下。 +- 3. ‌使用方式‌ +‌fs.readFile‌ 需要提供一个回调函数来处理读取结果。回调函数接收两个参数:错误对象 err 和文件内容 data。如果读取过程中出现错误,err 会包含错误信息;否则 data 是文件内容。 + +javascript +Copy Code +const fs = require('fs'); +fs.readFile('example.txt', 'utf8', (err, data) => { + if (err) throw err; + console.log(data); +}); +‌fs.readFileSync‌ 直接返回文件内容。如果读取过程中出现错误,会抛出异常,因此通常需要使用 try...catch 来捕获错误。 + +javascript +Copy Code +const fs = require('fs'); +try { + const data = fs.readFileSync('example.txt', 'utf8'); + console.log(data); +} catch (err) { + console.error('读取文件出错:', err); +} +- 4. ‌性能与适用场景‌ +‌fs.readFile‌ 适合处理高并发、I/O密集型任务,因为它不会阻塞事件循环。 +‌fs.readFileSync‌ 适合处理小型文件,且对执行顺序有严格要求的场景。但由于其阻塞性质,在处理大文件或高并发时可能影响性能。 +总结来说,fs.readFile 是异步非阻塞的,适合大多数实际应用场景;而 fs.readFileSync 是同步阻塞的,适用于简单场景或对执行顺序有严格要求的情况。 +3. 如何实现文件的追加写入? + - 1. 该代码演示了Node.js中文件追加写入的两种方式:异步appendFile和同步appendFileSync。 + - 2. 异步方式不会阻塞程序执行,适合高并发场景。 + - 3. 同步方式会阻塞后续代码执行,但逻辑更直观。 + - 4. 两种方式都支持指定编码格式,如utf8。 + - 5. 文件不存在时会自动创建文件。 +4. 什么是流式处理?它适合什么场景? + 流式处理(Stream Processing)是一种实时处理连续数据流的技术。它能够在数据生成时逐条或微批次即时处理,而不是像传统批处理那样等待数据积累到一定量后再进行处理。这种处理方式的核心特点是‌实时性‌和‌连续性‌,适用于需要快速响应的数据处理场景。 + 流式处理通过事件驱动架构处理无边界数据集,采用分布式处理框架保证低延迟。其处理的数据流是持续不断的,与批处理的最大区别在于处理时机和数据处理单位(持续流 vs 离散批)。 + 流式处理适合以下场景: +‌- 实时监控与分析‌:例如金融交易监控、物联网数据采集、实时推荐系统等。在金融领域,可以实时监测市场波动、交易异常、欺诈行为等风险因素。在物联网中,可以实时分析传感器数据,帮助优化设备性能和维护。 +- ‌实时决策支持‌:如电商实时监测用户行为、购买意向、库存需求等,从而优化用户体验和库存管理。或者在交通领域,实时监测交通拥堵、车流量、事故情况等。 +‌事件驱动架构‌:构建事件驱动的系统,实现异步通信、事件驱动的处理和消息传递。例如,当用户在社交平台发布内容时,系统可以实时触发相关事件,如推送通知、更新推荐列表等。 +- ‌大规模数据处理‌:需要处理大规模实时数据流,满足高吞吐量和低延迟的要求。例如,处理来自传感器、日志文件、社交媒体馈送等实时来源的数据。 +‌工业4.0与智能制造‌:在制造业中,实时处理设备传感器数据,预测设备维护需求。 +‌- 实时计算与分析‌:如实时大屏展示(如双11总交易额实时大屏),或者基于实时广告流量数据调整广告策略。 +‌流式图处理‌:在需要处理数据流中节点和边关系的场景中,如实时流量归因、实时用户行为意图分析等。 +- 流式处理与批处理相比,优势在于实时性、高效性和弹性伸缩。它能帮助企业快速响应变化,实现敏捷决策和优化运营。然而,它也要求系统具备处理乱序事件、保证数据一致性和容错机制的能力。 +5. 如何监听文件的变化? +监听文件变化是许多应用程序中的常见需求,尤其是在需要实时响应文件系统变动的场景中。以下是几种主流的实现方式: + 1.使用 Python 的 Watchdog 库 +Watchdog 是一个跨平台的 Python 库,能够高效地监听文件系统事件。它基于操作系统原生的事件接口(如 Linux 的 inotify、Windows 的 ReadDirectoryChangesW),性能远高于手动轮询。 +核心组件 +‌EventHandler‌:事件处理器,定义监控到文件事件后要执行的逻辑 +‌Observer‌:观察者,负责启动监控线程,监听文件系统事件 +‌FileSystemEvent‌:事件对象,包含事件类型、文件路径等信息 +2. 使用操作系统原生机制 +Linux 系统 +Linux 提供了 inotify 机制来监控文件系统变化。通过 inotify,可以监控文件的创建、删除、修改等事件。Python 中可以使用 inotify 库来实现。 +Windows 系统 +Windows 系统使用 ReadDirectoryChangesW API 来实现文件监控。 +3. 其他语言实现 +Java +Java 8 引入了 NIO.2 的 WatchService API,可以优雅地监控文件系统变化。 +C# +C# 中可以使用 FileSystemWatcher 类来监听文件系统事件。 +4. 轮询方式(不推荐) +虽然可以通过定时轮询检查文件状态变化,但这种方式效率低下,不推荐在生产环境中使用。 +应用场景 +文件监控适用于多种场景: +自动化构建工具 +日志文件分析 +配置文件动态加载 +文件同步服务 +实时备份系统 +选择合适的监听方式取决于具体的应用需求、运行环境和性能要求。对于 Python 开发者而言,Watchdog 库是一个功能强大且易于使用的首选方案。 + diff --git "a/\345\255\231\351\271\255\347\277\224/20260319-\350\257\276\345\240\202\347\254\224\350\256\260.md" "b/\345\255\231\351\271\255\347\277\224/20260319-\350\257\276\345\240\202\347\254\224\350\256\260.md" new file mode 100644 index 0000000000000000000000000000000000000000..88f9cf46c660d5623793047a6f175eb4418ae26d --- /dev/null +++ "b/\345\255\231\351\271\255\347\277\224/20260319-\350\257\276\345\240\202\347\254\224\350\256\260.md" @@ -0,0 +1,74 @@ +### 1. + +### 1.1为什么要学习文件系统? + +在Web应用中,经常需要和文件打交道: + +- 用户上传头像,需要保存到服务器 +- 读取配置文件,获取数据库连接信息 +- 生成日志文件,记录系统运行状态 +- 备份重要数据,防止丢失 + +**Node.js的fs模块**提供了强大的文件操作能力,让我们可以轻松读写文件! + +### 1.2fs模块的特点 + +| 特点 | 说明 | +| -------- | ------------------------------------ | +| 功能完善 | 读写、复制、删除、移动、监听... | +| 两种方式 | 同步(带Sync)和异步(回调/Promise) | +| 流式处理 | 支持大文件流式读写 | +| 权限控制 | 支持设置文件权限 | + +## 2.任务及最终效果 + +### 2.1本任务目标 + +完成本任务后,你将能够: + +| 目标 | 说明 | +| -------- | --------------------------- | +| 读取文件 | 使用fs.readFile读取文件内容 | +| 写入文件 | 使用fs.writeFile写入数据 | +| 目录操作 | 创建、删除目录 | +| 文件操作 | 复制、删除、重命名文件 | +| 路径处理 | 结合path模块使用 | + +### 2.2 最终效果展示 + +``` +const fs = require('fs'); +const path = require('path'); + +// 1. 读取文件 +const content = fs.readFileSync('./data.txt', 'utf8'); +console.log(content); + +// 2. 写入文件 +fs.writeFileSync('./new.txt', 'Hello Node.js'); + +// 3. 判断文件是否存在 +if (fs.existsSync('./data.txt')) { + console.log('文件存在'); +} + +// 4. 读取目录 +const files = fs.readdirSync('./src'); +console.log(files); + +// 5. 创建目录 +fs.mkdirSync('./backup', { recursive: true }); + +``` + +## 小结 + +### 核心知识点 + +| 知识点 | 关键内容 | +| ------------ | ---------------------------------------------- | +| **读取文件** | readFileSync / readFile / promises.readFile | +| **写入文件** | writeFileSync / appendFileSync / writeFile | +| **文件操作** | existsSync / stat / unlink / rename / copyFile | +| **目录操作** | mkdir / rmdir / readdir | +| **文件监听** | watch / watchFile | \ No newline at end of file diff --git "a/\345\255\231\351\271\255\347\277\224/20260320-\350\257\276\345\240\202\347\254\224\350\256\260.md" "b/\345\255\231\351\271\255\347\277\224/20260320-\350\257\276\345\240\202\347\254\224\350\256\260.md" new file mode 100644 index 0000000000000000000000000000000000000000..4457319386418f1045fb81ecdcf25cc2a926c952 --- /dev/null +++ "b/\345\255\231\351\271\255\347\277\224/20260320-\350\257\276\345\240\202\347\254\224\350\256\260.md" @@ -0,0 +1,54 @@ +1.请解释req和res分别代表什么? + +在Web开发中,特别是在使用Node.js和Express框架时,`req` 和 `res` 是两个非常重要的对象,分别代表‌**请求(Request)**‌和‌**响应(Response)**‌。 + +- `req`(Request 对象):封装了客户端发送给服务器的所有信息。它包含了请求的 URL、HTTP 方法(如 GET、POST)、查询参数、请求头(headers)、请求体(body)等数据。例如,可以通过 `req.params` 获取路径参数,通过 `req.query` 获取查询参数,通过 `req.body` 获取 POST 请求中的数据。 +- `res`(Response 对象):用于服务器向客户端发送响应。它可以设置响应的状态码、响应头(headers)、以及响应的内容(如文本、JSON 数据等)。例如,可以使用 `res.send()` 发送响应内容,使用 `res.json()` 发送 JSON 格式的数据,或者使用 `res.redirect()` 进行重定向。 + +简单来说,`req` 是服务器用来接收客户端请求的数据,而 `res` 是用来向客户端返回响应数据的对象。这两个对象在处理 HTTP 请求与响应的过程中起着核心作用。 + +2.http.createServer的回调函数接收哪些参数? + +`http.createServer()` 方法的回调函数接收两个参数: + +1. ‌**`req` (请求对象)**‌:这是一个 `http.IncomingMessage` 对象,包含了客户端发送给服务器的请求信息。它包含了请求的 URL、HTTP 方法(如 GET、POST)、请求头(headers)、请求体(body)等数据。 +2. ‌**`res` (响应对象)**‌:这是一个 `http.ServerResponse` 对象,用于服务器向客户端发送响应。你可以使用它来设置响应的状态码、响应头(headers)、以及响应的内容。 + +这两个参数是处理 HTTP 请求和响应的核心对象。 + +3.如何获取URL中的查询参数? + +​ 1.使用 `url` 模块和 `querystring` 模块: +这是传统的方法,适用于较老版本的 Node.js。 + +- 引入 `url` 和 `querystring` 模块。 + +- 使用 `url.parse(req.url)` 解析 URL 字符串,获取查询字符串部分。 + +- 使用 `querystring.parse()` 将查询字符串转换为对象。 + +- 从该对象中获取所需的参数值。 + + 2.使用 `URL` 构造函数 (Node.js v6+ 推荐): + + 这是现代 Node.js 推荐的方法,基于 WHATWG URL 标准。 + + - 使用 `new URL(req.url, `http://${req.headers.host}`)` 构造 URL 对象。 + + - 使用 `URLSearchParams` 对象访问查询参数。 + + - 使用 `searchParams.get()` 方法获取特定参数的值。 + + 3.使用 `url` 模块的 `parse` 方法 (带 `true` 参数): + + `url.parse()` 方法有一个布尔参数,用于决定是否将查询字符串解析为对象。设置为 `true` 时,会自动解析查询字符串。 + + - 使用 `url.parse(req.url, true)` 解析 URL,`true` 参数表示解析查询字符串。 + + - 从返回对象的 `query` 属性中获取查询参数对象。 + + - 从该对象中获取所需的参数值。 +4.res.writeHead和res.setHeader有什么区别? + + + \ No newline at end of file