1、概念
Buffer是一个类似于数组的对象,用于表示固定长度的字节序列
Buffer本质是一段内存空间,专门用来处理二进制数据
2、特点
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);
程序运行的基本流程
fs模块可以实现与硬盘的交互,例如文件的创建、删除、重命名、移动,还有文件内容的写入、读取、以及文件夹的相关操作。
1. 写入文件
//1.导入fs模块
const fs = require('fs');
//2.写入文件
fs.writeFile('./座右铭.txt','三人行,则必有我师焉',err=>{
//err 写入失败:错误对象 写入成功:null
if(err){
console.log('写入失败');
return;
}
console.log('写入成功');
});
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','\r\n温故而知新,可以为师矣')
//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('半亩方塘一鉴开\r\n');
ws.write('天光云影共徘徊\r\n');
ws.write('问渠那得清如许\r\n');
ws.write('为有源头活水来\r\n');
//4.关闭通道
ws.close();
5. 文件写入应用场景
文件写入在计算机中是一个非常常见的操作,下面的场景都用到了文件写入
当需要持久化保存数据的时候,应该想到文件写入
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. 读取文件应用场景
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. 文件删除
//1.导入fs模块
const fs = require('fs');
//调用unlink方法
fs.unlink('./观书有感.txt', err => {
if(err){
console.log('操作失败');
return ;
}else{
console.log('操作成功');
}
});
//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模块对资源进行操作时,路径的写法有两种:
相对路径中所谓的当前目录,指的是命令行的工作目录,而并非是文件的所在目录
所以当命令行的工作目录与文件所在目录不一致时,会出现一些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模块提供了操作路径的功能,当用API如下:
API | 说明 |
---|---|
path.resolve | 拼接规范的绝对路径 |
path.sep | 获取操作系统的路径分隔符 |
path.parse | 解析路径并返回对象 |
path.basename | 获取路径的基础名称 |
path.dirname | 获取路径的目录名 |
path.extname | 获得路径的扩展名 |
方法 | 作用 |
---|---|
GET | 主要用于获取数据 |
POST | 主要用于新增数据 |
PUT/PATCH | 主要用于更新数据 |
DELETE | 主要用于删除数据 |
HEAD/OPTIONS/CONNECT/TRACE | 使用相对较少 |
状态码 | 含义 |
---|---|
200 | 请求成功 |
403 | 禁止请求 |
404 | 找不到资源 |
500 | 服务器内部错误 |
状态码 | 含义 |
---|---|
1xx | 信息响应 |
2xx | 成功响应 |
3xx | 重定向消息 |
4xx | 客户端错误响应 |
5xx | 服务端错误响应 |
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) | 除上述之外 |
端口的主要作用:
实现不同主机应用程序之间的通信