【Node.js学习 day2——预备知识】

Buffer(缓冲器)

1、概念
Buffer是一个类似于数组的对象,用于表示固定长度的字节序列
Buffer本质是一段内存空间,专门用来处理二进制数据
2、特点

  • Buffer大小规定且无法调整
  • Buffer性能较好,可以直接对计算机内存进行操作
  • 每个元素的大小为1字节(byte)

3、使用

  • 创建Buffer(3种方式)
//1.alloc
let buf = Buffer.alloc(10);
console.log(buf)

//2.allocUnsafe
let buf_2 = Buffer.allocUnsafe(10);
console.log(buf_2);

//3.from 字符串或其他转换
let buf_3 = Buffer.from('hello');
let buf_4 = Buffer.from([105, 108, 111, 118, 101, 121, 111, 117]);
console.log(buf_4);

4、 Buffer操作及注意事项

//buffer与字符串的转换
let buf_4 = Buffer.from([105, 108, 111, 118, 101, 121, 111, 117]);
console.log(buf_4.toString());//utf-8

let buf = Buffer.from('hello');
console.log(buf[0].toString(2));
console.log(buf);
buf[0]=95;
console.log(buf.toString());

//溢出
let buf_1 = Buffer.from('hello');
buf[0] = 361;//舍弃高位的数字 0001 0110 1001 => 0110 1001
console.log(buf_1);//69

//中文
let buf_2 = Buffer.from('你好');
console.log(buf_2);

程序运行的基本流程

  • 程序一般保存在硬盘中,软件安装的过程就是将程序写入硬盘的过程。
  • 程序在运行时会加载进入内存,然后由CPU读取并执行程序

进程与线程

  • 进程:进行中的程序
  • 线程:一个进程中执行的一个执行流
  • 一个线程是属于某个进程的
  • 一个进程往往包含多个线程

fs模块

fs模块可以实现与硬盘的交互,例如文件的创建、删除、重命名、移动,还有文件内容的写入、读取、以及文件夹的相关操作。

1. 写入文件

//1.导入fs模块
const fs = require('fs');

//2.写入文件
fs.writeFile('./座右铭.txt','三人行,则必有我师焉',err=>{
    //err 写入失败:错误对象 写入成功:null
    if(err){
        console.log('写入失败');
        return;
    }
    console.log('写入成功');
});

在这里插入图片描述
2. 同步与异步

fs.writeFileSync(‘./data.txt’, 'test);

3. 文件追加写入

//1.导入fs模块
const fs = require('fs');

//1.调用appendFile 异步追加写入
fs.appendFile('./座右铭.txt',',择其善者而从之,其不善者而改之', err=>{
    //判断
    if(err){
        console.log('写入失败~~');
        retun;
    }
    console.log('追加写入成功');
})

//2.同步追加写入
fs.appendFileSync('./座右铭.txt','rn温故而知新,可以为师矣')

//3.writeFile实现追加写入(重写)
fs.writeFile('./座右铭.txt', 'love love love', err =>{
    if(err){
        console.log('写入失败~');
        return ;
    }
    console.log('写入成功');
})

4. 文件流式写入
程序打开一个文件是需要消耗资源的,流式写入可以减少打开关闭文件的次数。
流式写入方式适用于大文件写入或者频繁写入的场景,writeFile适合于写入频率较低的场景。

//1.导入fs
const fs = require('fs');

//2.创建写入流对象
const ws = fs.createWriteStream('./观书有感.txt');

//3.write
ws.write('半亩方塘一鉴开rn');
ws.write('天光云影共徘徊rn');
ws.write('问渠那得清如许rn');
ws.write('为有源头活水来rn');

//4.关闭通道
ws.close();

5. 文件写入应用场景
文件写入在计算机中是一个非常常见的操作,下面的场景都用到了文件写入

  • 下载文件
  • 安装文件
  • 保存程序日志,如Git
  • 编辑器保存文件
  • 视频录制

当需要持久化保存数据的时候,应该想到文件写入

6. 文件读取
文件读取顾名思义,就是通过程序从文件中取出其中的数据,可以使用如下几种方式:

方法 说明
readFile 异步读取
readFileSync 同步读取
createReadStream 流式读取
//1.导入fs模块
const fs = require('fs');

//2.异步读取
fs.readFile('./观书有感.txt', (err, data) => {
    if(err){
        console.log('读取失败~');
        return ;
    }
    console.log(data.toString());
});

//3.同步读取
let data = fs.readFileSync('./观书有感.txt');
console.log(data.toString());

流式读取:

//1.导入fs模块
const fs = require('fs');

//2.创建读取流对象
const rs = fs.createReadStream('../资料/笑看风云.mp4');

//3.绑定data时间  chunk 块儿  大块儿
rs.on('data', chunk =>{
    console.log(chunk.length);//65536字节 => 64KB
    // console.log(chunk.toString()); //65536字节 => 64KB
});

//4. end 可选事件
rs.on('end', ()=>{
    console.log('读取完成');
});

7. 读取文件应用场景

  • 电脑开机
  • 程序运行
  • 编辑器打开文件
  • 查看图片
  • 播放视频
  • 播放音乐
  • Git查看日志
  • 上传文件
  • 查看聊天记录

8. 文件复制

//1.导入fs模块
const fs = require('fs');

//1、readFile
//读取文件内容
let data = fs.readFileSync('../资料/笑看风云.mp4');
//写入文件
fs.writeFileSync('../资料/笑看风云-2.mp4',data);

//2、流式操作
//创建读取流对象
const rs = fs.createReadStream('../资料/笑看风云.mp4');
//创建写入流对象
const ws = fs.createWriteStream('../资料/笑看风云.mp4');

//绑定data事件
rs.on('data', chunk =>{
    ws.write(chunk);
});

8. 文件重命名和移动

  • 重命名
//1.导入fs模块

const fs = require('fs');

//调用rename方法
fs.rename('./座右铭.txt', './论语.txt', err =>{
    if(err){
        console.log('操作失败~');
        return ;
    }
    console.log('操作成功!');
});
  • 移动
//1.导入fs模块

const fs = require('fs');

//调用rename方法
fs.rename('./论语.txt','../资料/论语.txt', err => {
    if(err){
        console.log('操作失败~');
        return ;
    }else{
        console.log('操作成功!');
    }
});

8. 文件删除

  • 调用unlink方法
//1.导入fs模块

const fs = require('fs');

//调用unlink方法
fs.unlink('./观书有感.txt', err => {
    if(err){
        console.log('操作失败');
        return ;
    }else{
        console.log('操作成功');
    }
});

  • 调用rm方法
//1.导入fs模块

const fs = require('fs');

//调用unlink方法
fs.rm('../资料/论语.txt', err => {
    if(err){
        console.log('操作失败');
        return ;
    }else{
        console.log('操作成功');
    }
});

9. 文件夹操作

//1.导入fs模块

const fs = require('fs');

//创建文件夹 mk make 制作 dir directory文件夹
fs.mkdir('./html', err=>{
    if(err){
        console.log('操作失败');
        return ;
    }else{
        console.log('操作成功');
    }
});

  • 递归创建
//1.导入fs模块

const fs = require('fs');

//递归创建
fs.mkdir('./a/b/c',{recursive: true}, err=>{
    if(err){
        console.log('操作失败');
        return ;
    }else{
        console.log('操作成功');
    }
});

在这里插入图片描述

  • 读取文件夹状态
//1.导入fs模块

const fs = require('fs');

//读取文件夹 read读取 dir directory文件夹
fs.readdir('../资料',(err, data)=>{
    if(err){
        console.log('操作失败');
        return ;
    }else{
        console.log(data);
    }
});

在这里插入图片描述
在这里插入图片描述

  • 删除文件夹
//1.导入fs模块

const fs = require('fs');

//删除文件夹 rm remove移除
fs.rmdir('./html', err => {
    if(err){
        console.log('删除失败');
        return ;
    }else{
        console.log('删除成功');
    }
});

  • 递归删除
//1.导入fs模块

const fs = require('fs');

//递归删除 不推荐使用
fs.rmdir('./a', {recursive:true}, err => {
    if(err){
        console.log('删除失败');
        return ;
    }else{
        console.log('删除成功');
    }
});

//推荐使用
fs.rm('./a',{recursive:true}, err => {
    if(err){
        console.log('操作失败');
        return ;
    }else{
        console.log('操作成功');
    }
})

10. 查看资源状态

//1.导入fs模块

const fs = require('fs');

//stat方法 status缩写 状态
fs.stat('../资料/观书有感.txt', (err, data) => {
    if(err){
        console.log('操作失败');
        return ;
    }else{
        console.log(data);
    }
});

在这里插入图片描述
11. 路径补充说明
fs模块对资源进行操作时,路径的写法有两种:

  • 相对路径
    ./座右铭.txt 当前目录下的座右铭.txt
    座右铭.txt 等效于上面的写法
    …/座右铭.txt当前目录的上一级目录中的座右铭.txt
  • 绝对路径
    D:/Program Files windows系统下的绝对路径
    /usr/bin Linux系统下的绝对路径

相对路径中所谓的当前目录,指的是命令行的工作目录,而并非是文件的所在目录
所以当命令行的工作目录与文件所在目录不一致时,会出现一些BUG

12. 相对路径的Bug与解决

//1.导入fs模块

const fs = require('fs');

//相对路径参照物:命令行的工作目录
fs.writeFileSync('./index.html', 'love');

//绝对路径 '全局变量' 保存的是:所在文件的所在目录的绝对路径
console.log(__dirname);
fs.writeFileSync(__dirname + 'index.html', 'love');

13. 批量重命名

//导入fs模块
const fs = require('fs');

//读取code文件夹
const files = fs.readdirSync('../资料');

//遍历数据
files.forEach(item =>{
    //拆分文件名
    let data = item.split('-');
    let [num, name] = data;
    //判断
    if(Number(num)<10){
        num ='0'+num;
    }
    //创建新的文件名
    let newName = num + '_' + name;
    //重命名
    fs.renameSync('../资料/${item}','../资料/${newName}');
});

path模块

path模块提供了操作路径的功能,当用API如下:

API 说明
path.resolve 拼接规范的绝对路径
path.sep 获取操作系统的路径分隔符
path.parse 解析路径并返回对象
path.basename 获取路径的基础名称
path.dirname 获取路径的目录名
path.extname 获得路径的扩展名

HTTP协议

在这里插入图片描述

  • 请求方法
方法 作用
GET 主要用于获取数据
POST 主要用于新增数据
PUT/PATCH 主要用于更新数据
DELETE 主要用于删除数据
HEAD/OPTIONS/CONNECT/TRACE 使用相对较少
  • URL
    Uniform Resource Locator 统一资源定位符
    在这里插入图片描述
    协议名+主机名
    在这里插入图片描述
  • 响应报文结构与响应行
    在这里插入图片描述
    在这里插入图片描述
    响应状态码
状态码 含义
200 请求成功
403 禁止请求
404 找不到资源
500 服务器内部错误
状态码 含义
1xx 信息响应
2xx 成功响应
3xx 重定向消息
4xx 客户端错误响应
5xx 服务端错误响应

IP

ip的作用:

  • ip本身是一个数字标识
  • ip用来标识网络中的设备,实现设备间通信

ip的分类:

类型 说明
本机回环IP地址 127.0.0.1~127.255.255.254
本机回环IP地址 127.0.0.1~127.255.255.254
局域网IP(私网IP) 192.168.0.0~192.168.255.255
172.16.0.0~172.31.255.255
10.0.0.0~10.255.255.255
广域网IP(公网IP) 除上述之外

端口

  • 应用程序的数字标识
  • 一台现代计算机有65536个端口(0~65535)
  • 一个应用程序可以使用一个或多个端口

端口的主要作用:
实现不同主机应用程序之间的通信

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>