带你一块儿撸一遍 nodejs 经常使用核心模块(二)

前沿:核心模块二主要是和流相关的部分,固然要想给这一块有清楚的了解,你须要对核心模块(一)中的内容有一些了解。前端

fs模块

fs模块的常见方法(全部的读方法,文件必须存在,不存在就会报错,全部的写方法,若是文件不存在,则建立该文件):node

  1. fs.readFile() --- fs.readFileSync()
let fs=require('fs');
//是把整个文件做为一个总体
fs.readFile('./1.txt',{encoding:'utf8'},function (err,data) {
	console.log(err);
	console.log(data);
});
//同步方法是没有回调函数的
let result=fs.readFileSync('./1.txt',{encoding: 'utf8'});
console.log(result);
复制代码
  1. fs.writeFile() ---fs.weiteFileSync()
const fs=require('fs');
//会覆盖文件原有内容
//fs.writeFile('./2.txt','123',{encoding: 'utf8'},(err) => {
//	console.log('write OK');
//})
fs.writeFileSync('./3.txt','456');
复制代码
  1. fs.appendFile()
const fs=require('fs');
//writeFile flags=w 写入,若是文件已经存在,则删除掉文件后再写入
//fs.writeFile('./4.txt','789',{flag:'a'});
//给文件追加内容,不会覆盖原有内容
fs.appendFile('./4.txt','789');
复制代码

以上三个方法的弊端:都是将文件总体读出或者写入。web

  1. fs.open()
fs.open(src, 'r', (err,fd))    //第一个参数表示文件,第二个表示什么方式(r, r+, w, w+, a, a+), 第三个是回调,其中 fd是文件描述符
复制代码
  1. fs.read() //将内容放到内存中
let buffer=Buffer.alloc(6);//[0,1,2,3,4,5]
fs.read(fd,buffer,0,3,3,(err,bytesRead) => {   //文件描述符,buffer,buffer0的位置,buffer的长度,文件读取的位置,
//回调 bytesRead表示实际字节
    console.log(buffer.toString());
});
复制代码
  1. fs.write()
let buffer=Buffer.from('每天向上');//[0,1,2,3,4,5,6,7,8,9,10,11]
//fd buffer offset
fs.write(fd,buffer,3,6,3,(err,bytesWritten) => { //文件描述符,buffer,buffer起始位置,buffer长度,文件写入位置,
//回调 bytesWritten表示实际字节
	console.log(err);
	fs.fsync(fd,(err) => {
		fs.close(fd,(err) => {
			console.log('关闭文件');
		});
	});
});
复制代码
  1. fs.createReadStream()面试

  2. fs.fsync()浏览器

  3. fs.createWriteStream()bash

来一个小例子,有助于理解websocket

// pipe
let fs = require('fs');
let rs = fs.createReadStream('./1.txt',{
    highWaterMark:1
})
let ws = fs.createWriteStream('./5.txt',{
    highWaterMark:2
})
let index = 1;
rs.on('data', (data) => {
    console.log(index++)
    let flag = ws.write(data);    // 当内部的可写缓冲的总大小小于 highWaterMark 设置的阈值时,
    //调用 writable.write() 会返回 true。 一旦内部缓冲的大小达到或超过 highWaterMark 时,则会返回 falseif (!flag) {     //内部缓冲超过highWaterMark
        rs.pause()
    }
})
let wsIndex = 1;
ws.on('drain', () => {
    console.log('ws'+wsIndex++)
    rs.resume()
})
// 1 2 ws1 3 4 ws2 5 6 ws3
复制代码
  1. fs.stat()
//读取文件的状态;不建议在调用 fs.open() 、fs.readFile() 或 fs.writeFile() 以前使用 fs.stat() 检查一个文件是否存在。
//做为替代,用户代码应该直接打开/读取/写入文件,当文件无效时再处理错误。
 //若是要检查一个文件是否存在且不操做它,推荐使用 fs.access()。
 let fs = require('fs');
fs.stat('./1.txt', (err, data) => {
    console.log(data)    //列举几个经常使用的属性 size,ctime,birthtime,mtime
})
复制代码
  1. fs.access() 文件是否存在
let fs = require('fs');
fs.access('./1.txt', (err) => {
    console.log(err)
})
复制代码
  1. fs.mkdir()
//建立目录 建立目录的时候必定要注意 父目录必定要存在
let fs = require('fs');
fs.mkdir('./a/b', (err) => {   //若是a目录不存在 则会报错
    console.log(err)
})
复制代码
  1. fs.rmdir()
//删除目录 同理 若是a目录不是空的,须要删除a里面的从里面往外一层一层删除,不然报错,directory not empty
let fs = require('fs');
fs.rmdir('./a', (err) => {
    console.log(err)
})
复制代码

TCP模块

//传输层 http websocket都是基于tcp tcp是一个可读可写流

// 传输层  http websocket (应用起来基本同样)
let net = require('net');

// 套接字
let server = net.createServer();
// 连接时会执行此方法,每次连接都会产产生一个socket对象
// http规定的头 设置一些头
// socket是一个可读可写的流 Duplex
server.on('connection',function(socket){
    // socket 没有规则 咱们能够用tcp 模拟http
    socket.setEncoding('utf8');
    socket.on('data',function(data){
        console.log(data);
    });
    //模拟
    socket.write(`
HTTP/1.1 200 ok
Content-Length: 5

hello
    `);
});
server.listen(3000);
//当咱们打开浏览器 localhost:3000时 能够看到hello
复制代码

http模块

//常见用法
var http=require("http");

http.createServer(function(req,res){
    res.writeHead(200,{
        "content-type":"text/plain"
    });
    res.write("hello nodejs");
    res.end();
}).listen(3000);
//在浏览器中输入 localhost:3000 咱们能够看到hello nodejs
复制代码

以上就是nodejs的经常使用核心模块的一部分,由于涉及的内容比较多并无深刻进去,其实每一个部分均可以展开里面有不少知识,不少深刻的知识我本人也不是很了解,但愿上面的一些核心内容可以帮助到你,固然有不少不足之处但愿朋友们提出指正。也但愿和各位朋友一块儿学习分享!前端工程师

后记:app

本文涉及到的流更加深刻一点的能够看socket

相关内容:

相关文章
相关标签/搜索