文件操作和网络通信

1. 文件操作

1.1. 为什么要进行文件操作

  • 浏览器端JavaScript不能操作文件(安全性考虑)
  • Node.js需要文件操作,因为
    • 可以开发命令行的工具,例如:i5ting
    • 开发高效率的web服务器,需要操作文件
  • 文件种类繁多,计算机最终存储的时候都是以2进制形式存储
  • 存储单位
    • 1byte = 8bit
    • 1k =
    • 1m = 1024k

1.2. Buffer对象

  • Buffer
    • Buffer对象是一个像Array的对象,主要存储字节
    • Node.js作为后端开发,需要处理图片、js、css等文件,图片等资源是以二进制形式存在的,所以在Node.js中增加了一个buffer对象,专门用来存放二进制数据
    • Buffer对象其实就是在内存中申请一块空间,用于存放数据
  • Buffer对象的使用(了解)

    • 第一种创建方式
      //开辟4个字节的空间存储数据
      let buffer = new Buffer(4);
      //创建完成后,buffer分配的内存可能有数据
      //清空buffer对象
      buffer.fill(0);
      
    • 第二种创建方式
      //直接存储数据在buffer中
      let buffer = new Buffer("hello itcast");
      
    • 读取文件中遇到的Buffer

      var fs = require("fs");
      fs.readFile("01-buffer.js", function (err,content) {
        //此处的content就是Buffer
        console.log(content);
      });
      
      fs.readFile("01-buffer.js","utf8", function (err,content) {
        //指定了编码后,获取到的content是字符串
        console.log(content);
      });
      
    • Buffer支持的编码

      • ascii
      • utf8 默认
      • utf16
      • ucs2
      • base64
      • hex
      • Binary
    • 支持gb2312-第三方包 iconv-lite

    • Buffer的常见方法

      • buf.write() 往buffer写入内容
      • buf.toString([编码]) 把buffer中的内容转换成字符串
      • buf.length 获取buffer的长度
      • Buffer.isEncoding("utf8") 检查支持的编码(不支持gb2312)
  • File System

    • 操作文件夹

      • mkdirSync() 同步创建文件夹
      • mkdir() 异步创建文件夹

      • rmdirSync() 同步删除文件夹

      • rmdir() 异步删除文件夹

      • 判断文件是否存在

    • 操作文件

      • writeFile() 写入文件,会覆盖以前的内容
      • appendFile() 追加文件
      • readFile() 读取文件
      • rename() 更改文件名
      • unlink() 删除文件
      • stat() 获取文件的相关属性

      • watchFile() 监控文件或文件夹内文件的改变

    • 练习:监视文件abc/abc.txt,如果文件发生变化把内容拷贝到target/123.txt

    • 拷贝文件:

      • 之前的方式只能拷贝小文件
      • 拷贝大文件
    • 文件流操作

      • createReadStream()
      • createWriteStream()
      • 拷贝大文件带进度

        ```javascript "use strict"

        const fs = require("fs");

        let sourceFile ="xdy.avi"; let targetFile = "123.itcast";

        //文件流读写 进行大文件复制 //创建读流对象 let rs = fs.createReadStream(sourceFile); //创建写流对象 let ws = fs.createWriteStream(targetFile);

    //文件大小
    let fileSize = fs.statSync(sourceFile).size;

    //总共写入的大小
    let writeTotal = 0;

    //监听data事件
    rs.on("data", chunk => {
        //每次读到的数据  buffer对象

        writeTotal += chunk.length;


        //把chunk写入目标文件
        ws.write(chunk);

        console.log(writeTotal/fileSize * 100);
    });

    //读取完毕
    rs.on("end", ()=>{
        console.log("文件读取完毕");

        //写入结束
        ws.end(()=>{
            console.log("文件写入完毕");
        });
    });
    ```

    - 管道拷贝大文件

    ```javascript
    "use strict"
    const fs = require("fs");

    let sourceFile ="xdy.avi";
    let targetFile = "123.itcast";

    let rs = fs.createReadStream(sourceFile);
    let ws = fs.createWriteStream(targetFile);

    rs.pipe(ws);
    ```

2. Node.js的异步编程

  • 同步和异步的概念
  • 非阻塞式I/O
  • 事件驱动
  • 回调函数
  • 监视js的变化重新运行的插件 npm install nodemon -g
    • 使用 nodemon js文件路径

3. 网络通信

  • 网络的概念

  • IP和端口的概念

  • Socket的概念

  • 打开telnet

    程序和功能-->

  • 自己开发一个小服务器

"use strict";

const net = require("net");


//创建server对象
let server = net.createServer();

//监听连接到服务器上的客户端
server.on("connection", (socket) => {
    console.log("haha");
    //服务器的socket
    //向客户端发送消息
    socket.write("welcome to my server");

    socket.on("data", (content) => {
        //服务器发送的内容。buffer
        console.log(content.toString());
    });
});

//监听端口
server.listen(8888,()=>{
    console.log("正在监听...");
});
  • 自己开发的客户端
"use strict";

var net = require("net");

let port = 8888;
let ip = "127.0.0.1";

//连接服务器
let client = net.createConnection(port,ip,()=>{
    console.log("连接服务器成功");

    //向服务器发送消息
    client.write("你好服务器");
});

//接收服务器的消息
client.on("data", (content) => {
    //服务器发送的内容。buffer
    console.log(content.toString());
});
  • 处理错误
//注册error事件
socket.on("error",()=>{
    console.log("客户端下线");
})
原文地址:https://www.cnblogs.com/bici/p/6036979.html