文件操作和网络通信
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了文件操作和网络通信相关的知识,希望对你有一定的参考价值。
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("客户端下线");
})
以上是关于文件操作和网络通信的主要内容,如果未能解决你的问题,请参考以下文章
VSCode自定义代码片段14——Vue的axios网络请求封装
VSCode自定义代码片段14——Vue的axios网络请求封装
VSCode自定义代码片段15——git命令操作一个完整流程