1.特殊的全局对象
- 这些全局对象可以在模块中任意使用,但是在命令行交互中是不可以使用的;
- 包括: dirname、filename、exports、module、require();
①__dirname:获取当前文件所在的路径: 注意:不包括后面的文件名;
②__filename:获取当前文件所在的路径和文件名称: 注意:包括后面的文件名称;
2. path常见的API
2.1 从路径中获取信息
- dirname:获取文件的父文件夹;
-
basename:获取文件名;
-
extname:获取文件扩展名;
2.2 路径的拼接
如果我们希望将多个路径进行拼接,但是不同的操作系统可能使用的是不同的分隔符;
这个时候我们可以使用path.join函数;
2.3 将文件和某个文件夹拼接
如果我们希望将某个文件和文件夹拼接,可以使用 path.resolve;
注意:resolve函数会判断我们拼接的路径前面是否有 /或../或./;
- 如果有表示是一个绝对路径,会返回对应的拼接路径;
- 如果没有,那么会和当前执行文件所在的文件夹进行路径的拼接 ;
3. Buffer存储二进制数据
3.1 Buffer作用
计算机中所有的内容:文字、数字、图片、音频、视频最终都会使用二进制来表示。
JavaScript可以直接去处理非常直观的数据:比如字符串,我们通常展示给用户的也是这些内容。
Node为了可以方便开发者完成更多功能,提供给了我们一个类Buffer,并且它是全局的。
3.2 Buffer中存储的是二进制数据
- 可以将Buffer看成是一个存储二进制的数组;
- 数组中的每一项,可以保存8位二进制: 00000000 ;
4. 阻塞IO与非阻塞IO
- 事实上我们任何程序中的文件操作都是需要进行系统调用(操作系统的文件系统);
- 事实上对文件的操作,是一个操作系统的IO操作(输入、输出);
①阻塞式调用: 调用结果返回之前,当前线程处于阻塞态(阻塞态CPU是不会分配时间片的),调用线程只有 在得到调用结果之后才会继续执行。
②非阻塞式调用: 调用执行之后,当前线程不会停止执行,只需要过一段时间来检查一下有没有结果返回即可。
阻塞和非阻塞,同步和异步有什么区别
- 阻塞和非阻塞是对于被调用者来说的;
- 在我们这里就是系统调用,操作系统为我们提供了阻塞调用和非阻塞调用;
- 同步和异步是对于调用者来说的;
- 在我们这里就是自己的程序;
- 如果我们在发起调用之后,不会进行其他任何的操作,只是等待结果,这个过程就称之为同步调用;
- 如果我们再发起调用之后,并不会等待结果,继续完成其他的工作,等到有回调时再去执行,这个过程就是 异步调用;
- Libuv采用的就是非阻塞异步IO的调用方式;