I/O 操作详解

I/O 是 Input/Output(输入/输出)的缩写,指计算机系统与外部世界或其他设备进行数据交换的过程。在编程中,I/O 操作通常涉及从外部源读取数据(输入)或将数据发送到外部目标(输出)。

核心概念

  1. 输入(Input):从外部获取数据
    • 示例:读取文件、接收网络请求、获取键盘输入、接收传感器数据
  2. 输出(Output):向外部发送数据
    • 示例:写入文件、发送网络请求、屏幕显示内容、控制打印机

JavaScript 中的常见 I/O 操作

类型浏览器环境示例Node.js 环境示例
文件 I/OFile API(用户文件上传)fs.readFile(), fs.writeFile()
网络 I/Ofetch(), WebSockethttp.request(), net 模块
用户 I/Oonclick, keyboard eventsreadline 模块(命令行输入)
设备 I/O摄像头/麦克风访问硬件通信(通过串行端口库)

为什么 I/O 操作很特殊?

  1. 速度极慢(相对于 CPU):
    在这里插入图片描述

  2. 不可预测性

    • 受网络延迟、磁盘状态、外部系统响应等影响
    • 可能失败(文件不存在、网络断开等)

JavaScript 如何处理 I/O?
由于 JavaScript 是单线程语言,采用 非阻塞 I/O 模型 避免卡住整个程序:

// 同步 I/O(阻塞 - 避免使用!)
const data = fs.readFileSync('file.txt'); // 程序卡住直到完成

// 异步 I/O(非阻塞 - 推荐方式)
fs.readFile('file.txt', (err, data) => {
  // 回调函数在 I/O 完成后执行
});

事件循环中的 I/O 处理流程

  1. 发起 I/O 请求(如 fetch())
  2. JavaScript 引擎将操作交给底层系统(浏览器/Node.js)
  3. 主线程继续执行后续代码
  4. I/O 完成后,结果放入 回调队列
  5. 事件循环将回调移入调用栈执行
    在这里插入图片描述

实际代码示例

console.log('启动'); // 同步

// 异步网络 I/O
fetch('https://api.example.com/data')
  .then(response => response.json()) // 微任务
  .then(data => console.log('收到数据:', data)); 

// 异步文件 I/O(Node.js)
fs.readFile('config.json', (err, content) => {
  console.log('文件内容:', content); // 宏任务
});

console.log('继续执行'); // 同步

执行顺序:

  1. 启动
  2. 继续执行
  3. 收到数据:(微任务优先)
  4. 文件内容:(宏任务)

为什么 I/O 属于宏任务?

  • I/O 回调通常被放入 宏任务队列
  • 与微任务的区别:
// 微任务(Promise)
Promise.resolve().then(() => console.log('微任务'));

// 宏任务(I/O回调)
setTimeout(() => console.log('宏任务'), 0);

// 输出顺序:微任务 → 宏任务

I/O 性能优化技巧

  1. 批量处理:合并多个小 I/O 请求
  2. 流式处理:使用流(Stream)处理大文件
// Node.js 流示例
fs.createReadStream('bigfile.mp4')
  .pipe(fs.createWriteStream('copy.mp4'));
  1. 缓存机制:减少重复 I/O
  2. 异步并行:使用 Promise.all() 并发多个 I/O

关键结论:I/O 操作是 JavaScript 异步编程的核心场景,理解其非阻塞特性是掌握事件循环的关键。永远避免同步 I/O,否则会阻塞整个应用!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值