隔壁孩子10篇博客node入门而且写了一个前后端分离项目,你怎么还在睡觉!!!(二)

————————————————————————————————————————————————————————————
-----------------今日份复习nodejs----------------------------
------ 1.回调函数
------ 2.异步编程
------ 3.fs文件基本操作
------ 4.fs流读写方式
------ 5.fs管道方式
————————————————————————————————————————————————————————————

1.回调函数

  • 回调函数也称为回调,将a函数作为参数传入b函数,b函数在执行过程中根据实际或条件决定是否调用a函数,a函数就是回调函数。
  • 代码示例
//回调函数简单示例
function show(){
    console.log("我是一个回调函数,被调用执行!")
}

//每两秒钟执行一次函数
setInterval(show,2000);
  • 图片示例
    在这里插入图片描述

1.1回调函数实现机制

  • 定义一个回调函数(实际上就是普通函数)。
  • 将回调函数的函数引用地址作为参数传递给调用者。
  • 当特定的事件发生时,调用函数。

1.2回调函数的作用

  • 通常用于在达到某个条件或者某个时机时,需要执行某个函数。
oBtn.onclick = function(){
	console.log("....//")
}
  • 在图片等资源加载完成后再显示页面。

2.同步和异步

  • 同步:上一行代码执行完以后,下一行代码才能得到执行。
  • 异步:将比较复杂的任务线程实现,不用等上一步执行完毕,下一步也可以执行。
  • 同步代码示例:
//同步的例子
console.log("1111");
console.log("2222");
console.time('t1');
for(var i = 0 ; i < 1000000; i++){
    //...
}
console.timeEnd('t1');
console.log('3333')

执行结果:
111
222
333
t1:543.2ms

同步代码,当for循环执行完毕时才会打印 3333.

  • 异步代码示例:
//同步的例子
console.log("1111");
console.log("2222");
setTimeout(function () {
    console.time('t1');
    for (var i = 0; i < 1000000000; i++) {
        //...
    }
    console.timeEnd('t1');
}, 2000)

console.log('3333');
执行结果:
111
222
333
t1:675.98ms
  • 你学懂了嘛?看看这个例子;
console.log("1111");
console.log("2222");
setTimeout(function () {
    console.log("4444")
}, 0)
console.time('t1');
for (var i = 0; i < 1000000000; i++) {
    //...
}
console.timeEnd('t1');

console.log('3333');

输出结果是???

3.异步的轮询机制

在这里插入图片描述
当发现了异步代码,setTimeout的时候,就创建一个事件轮询表,将当前异步函数依次加入事件轮询表,等待同步代码执行完毕之后再执行异步代码。

4.异步的实现方式

  • 1.回调函数(回调函数不一定是异步,一不一定有回调函数)
  • 2.事件
  • 3.promise (vue中有精讲)
    略过。。。。。。

5.fs文件的基本操作(*)

5.1 文件读取

由于nodeJS是服务器端程序,所以必须要有读写文件操作。在客户端没有这种东西。

5.1.1 直接读取 --> 将硬盘上的所有内容都全部读取完成以后才触发回调函数。
  • 同步读取
fs.readFile('文件路径',function(错误对象, 数据){
	//相关操作
})
  • 异步读取
fs.readFileSync('文件路径',function(错误对象, 数据){
	//相关操作
})
  • 同步异步文件读取代码示例:
const fs = require("fs");

//直接读取文件 --> 异步读取文件
console.log('111');
fs.readFile('./data.txt',(err, data) => {
    console.log(data.toString());
})
console.log('222');

结果:
111
222
data



//直接读取文件 --> 同步读取文件
console.log('111');
const data = fs.readFileSync('./data.txt');
console.log(data.toString());
console.log('222');

结果:
111
data
222
5.1.2 流式读取 --> 将数据从硬盘中读取一截触发回调函数,读取一截处理一截,实现大文件操作。

5.2 写文件

  • 同步写文件

  • 异步写文件

fs.writeFile('文件名','数据',function(err){
	//处理
})
const fs = require('fs');

//写文件  --> 异步写入文件
var data = '今天天气很棒,我们想出去玩';
fs.writeFile('data2.txt',data, err=>{
    if(err){
        throw err;
    }else{
        console.log('文件写入成功!')
    }
})

注意当文件地址不存在时,会自动创建一个新的文件。

5.3 读取文件信息

  • 读取文件信息
fs.stat('文件名',function(err, state){
	//文件的常用信息
})
var fs = require('fs');

//读取文件信息
fs.stat('data2.txt',(err, data) => {
    console.log(data)
})

结果:
Stats {
  dev: 1151101253,
  mode: 33206,
  nlink: 1,
  uid: 0,
  gid: 0,
  rdev: 0,
  blksize: 4096,
  ino: 2533274790560553,
  size: 39,
  blocks: 0,
  atimeMs: 1585301029205.3352,
  mtimeMs: 1585301029205.3352,
  ctimeMs: 1585301029205.3352,
  birthtimeMs: 1585301029204.3394,
  atime: 2020-03-27T09:23:49.205Z,
  mtime: 2020-03-27T09:23:49.205Z,
  ctime: 2020-03-27T09:23:49.205Z,
  birthtime: 2020-03-27T09:23:49.204Z
}

5.4删除文件

  • 删除文件
fs.unlick('文件路径',function(err){
	//抛出错误
})
const fs = require('fs');

//删除文件
fs.unlink('./data.txt',err => {
    if(err){
        throw err
    }else{
        console.log("文件删除成功!")
    }
})
  • node递归删除文件夹
const fs = require("fs");
const path = require("path");
function fn(url) {
  // 首先判断要删除的目录是否存在,如果存在则进入判断
  // console.log(fs.existsSync(url));//true
  if (fs.existsSync(url)) {
    // 读取要删除的目录,获取目录下的文件信息
    let files = fs.readdirSync(url);
    // 循环遍历要删除的文件
    files.forEach(file => {
      //   console.log(file);//1.text dir2
      // 将文件的名字和要删除的目录路径组合,得到要删除的文件的路径
      let filePath = path.join(url, file);
      //   如果是目录,继续遍历(递归遍历)
      if (fs.statSync(filePath).isDirectory()) {
        fn(filePath);
      } else {
        // 如果是文件,直接删除文件
        fs.unlinkSync(filePath);
      }
    });
    fs.rmdirSync(url); //删除所有的空目录
  }
}

fn("./dir1");

5.5读入流和写入流

  • stream流
    所有互联网传输的数据都是以流的方式传递的,流是一组有起点有终点的数据传输方式。
  • 流式读取文件
const fs = require('fs');

//流式读取文件  异步

//创建一个可以读取的流
var stream = fs.createReadStream('./data.txt');

//绑定data事件,当读取到内容时就执行
stream.on('data',a => {
    console.log('流式读取文件');
    console.log(a);
    console.log(a.length);
})

//读取文件的完成事件finish
stream.on('end',err => {
    console.log("读取文件完毕!")
})


//读取文件的出错事件
stream.on('error',err =>{
    console.log("读取出错了!")
})

读取结果:

流式读取文件
<Buffer 9f e6 88 90 e8 ba ab e9 80 80 e7 9a 84 e6 97 b6 e5 80 99 e4 ba 86 e3 80 82 e6 88 91 e4 bb 8e e6 9d a5 e9 83 bd e4 b8 8d e6 84 bf e6 84 8f e5 8a a0 e5 ... 65486 more bytes>
65536
流式读取文件
<Buffer 88 91 ef bc 8c e5 92 8c e4 bd a0 e6 98 af e4 bb 80 e4 b9 88 e5 85 b3 e7 b3 bb e3 80 82 e5 b0 8f e5 88 9a ef bc 8c e4 bd a0 e7 9f a5 e9 81 93 e7 9a 84 ... 65486 more bytes>
65536
流式读取文件
<Buffer 0d 0a 20 20 20 20 e5 94 90 e4 b8 89 e7 9c 8b e5 90 91 e9 9b aa e5 b4 a9 ef bc 8c e4 bb 96 e7 9a 84 e7 9b ae e5 85 89 e7 aa 81 e7 84 b6 e5 8f 98 e5 be ... 65486 more bytes>
65536
流式读取文件
<Buffer ac e4 b9 8b e9 97 b4 e7 9a 84 e5 85 b3 e7 b3 bb e5 91 8a e8 af 89 e4 ba 86 e4 bb 96 e3 80 82 e5 bd 93 e6 97 b6 ef bc 8c e8 80 81 e5 b8 88 e7 9a 84 e8 ... 65486 more bytes>
65536
流式读取文件
<Buffer 20 20 20 20 e2 80 9c e6 98 af e3 80 82 e6 88 91 e4 b8 80 e5 ae 9a e4 bc 9a e7 ba a6 e6 9d 9f e5 b8 9d e5 9b bd e5 b0 86 e5 a3 ab ef bc 8c e7 bb 9d e4 ... 65486 more bytes>
65536
流式读取文件
<Buffer 88 91 e5 92 8c e8 80 81 e5 b8 88 e4 ba 89 e5 90 b5 e8 b5 b7 e6 9d a5 ef bc 8c e6 8d ae e7 90 86 e5 8a 9b e4 ba 89 e3 80 82 e6 88 91 e5 91 8a e8 af 89 ... 65486 more bytes>
65536
流式读取文件
<Buffer 93 e7 90 86 e7 9a 84 ef bc 8c e5 9c a8 e8 bf 99 e6 ac a1 e4 b8 8e e6 ad a6 e9 ad 82 e5 b8 9d e5 9b bd e7 9a 84 e6 88 98 e4 ba 89 e4 b9 8b e4 b8 ad ef ... 65486 more bytes>
65536
流式读取文件
<Buffer e3 80 82 e4 bb 96 ef bc 8c e9 82 a3 e4 b8 aa e7 a6 bd e5 85 bd ef bc 8c e5 b0 b1 e5 9d 90 e5 9c a8 e6 88 91 e8 ba ab e8 be b9 ef bc 8c e4 bd a0 e7 9f ... 65486 more bytes>
65536
流式读取文件
<Buffer bb ef bc 8c e4 bd 86 e4 bb 96 e8 bf 98 e6 98 af e7 82 b9 e4 ba 86 e7 82 b9 e5 a4 b4 ef bc 8c e9 81 93 ef bc 9a e2 80 9c e5 a5 bd ef bc 8c e6 88 91 e7 ... 65486 more bytes>
65536
流式读取文件
<Buffer 80 ef bc 8c e4 bb 96 e5 b0 b1 e4 bc 9a e7 ab 8b e5 88 bb e6 9d 80 e4 ba 86 e4 bd a0 e3 80 82 e2 80 9d 0d 0a 0d 0a 20 20 20 20 e5 90 ac e7 9d 80 e6 af ... 63351 more bytes>
63401

一截截读取文件,每次大小为64KB.

  • 流式写入文件
const fs = require('fs');

//创建一个可以写入的流
var stream = fs.createWriteStream('./data3.txt');

//写入数据
stream.write('今天礼拜一');
stream.write('明天礼拜二');
stream.write('后天礼拜三');

//写入完毕
stream.end();

//写入流的完成事件finish
stream.on('finish',err => {
    console.log("写入文件完毕!")
})
//写入流的出错事件
stream.on('error',err =>{
    console.log("出错了!")
})

5.6 管道(提供了输出流到写入流的方式)

  • 什么是管道 pipe(管道是直接定义一个输出流,导入输入流)
写法:
输出流.pipe(写入流)
  • 实现大文件的复制
const fs = require("fs");

//实现大文件的复制

//通过stream流的方式复制
//创建一个读取流  读取文件data
var stream1 = fs.createReadStream('./data.txt');

//创建一个可以写入的流  写入文件 data4.txt
var stream2 = fs.createWriteStream('./data4.txt');

//stream1 读取一截文件 就往stream2 写入一截文件
stream1.on('data', data => {
    stream2.write(data);
})

//判断读取完毕
stream1.on('end',err => {
    if(err){
        throw err;
    }else{
        console.log('读取文件完毕!');
        //停止文件写入
        stream2.end();
        //文件复制已经完成
        console.log("文件复制已经完成!")
    }
})


  • 通过管道方式来实现大文件的复制
const fs = require("fs");

//通过管道来实现实现大文件的复制

//通过stream流的方式复制
//创建一个读取流  读取文件data
var stream1 = fs.createReadStream('./data.txt');

//创建一个可以写入的流  写入文件 data4.txt
var stream2 = fs.createWriteStream('./data5.txt');

stream1.pipe(stream2);

5.7 链式流(实现压缩文件)

  • 链式流:将多个管道连接起来,实现链式处理
  • 需求:使用链式流实现大文件压缩文件
//使用链式流实现大文件压缩

const fs = require('fs');
const zlib = require('zlib');

//创建一个读取流
const stream1 = fs.createReadStream('./data4.txt');

//创建一个写入流
const stream2 = fs.createWriteStream('./data4.txt.zip');

//压缩
stream1.pipe(zlib.createGzip()).pipe(stream2);
stream1.on('end',err =>{
    console.log("压缩文件成功!");
})

————————————————————————————————————
写在后面

隔壁孩子10篇博客node入门而且写了一个前后端分离项目,你怎么还在睡觉!!!(三)

  • 常用模块的学习
  • node网络服务器基础
  • node初步搭建一个网络服务器
  • 获取get和post方式的传值
    ——————————————————————————————————
    ————————————————
发布了85 篇原创文章 · 获赞 16 · 访问量 6081

猜你喜欢

转载自blog.csdn.net/qq_43955202/article/details/105144334