cmd
- 环境变量(windows系统中的变量)
- path环境变量
path坏境变量中保存的是一个一个的路径,路径之间使用;隔开-作用: - 当我们在命令行窗口中调用一个命令,或访问一个文件时,系统会先在当前文件夹中寻找,如果找不到则依次去path的路径下寻找,如果找到则直接使用,如果没有找到则继续向下一个路径去寻找,如果所有的路径中都没有找到,则报错
- 可以将一些常用的文件或程序的路径添加到path下,这样我们就可以在任意位置来访问这些文件了
进程和线程
- 进程
-- 进程负责为程序的运行提供必备的环境-进程就相当于工厂中的车间
线程 - 线程计算机中的最小的计算单位,线程负责执行进程中的程序,线程就相当于工厂中的工人
- 单线程
- 多线程
Node.js简介
- Node.js是一个能够在服冬瞾端运行JavaScript的开放源代码、跨平否JavaScript运行环境。
- Node采用Google开发的V8引擎运行js代码,使用事件驱动非阻塞和异步I/o模型等技术来提高性能,可优化应用程序的传输量和规模。
- Node大部分基本模块都用JavaScript编写。在Node出现之前,
- 通常作为客户端程序设计语言使用,以S写出的程序常在用户的浏览器上运行。
- 目前,Node已被IBM、、Microsoft、Yahoo!、Walmart、Groupon.SAP、LinkedIn、Rakuten、PayPal、Voxer和GoDaddy等企业采用
- Node的服务器单线程的
- Node处理请求时是单线程,但是在后台拥有一个
IO线程池
模块化
- 在node中有一个全局对象globalThis,它的作用和网页中window类似
- 在全局中创建的变量都会作为global的属性保存
- 在全局中创建的函数都会作为global的方法保存
- 当node在执行模块中的代码时,它会首先在代码的最顶部,添加如下代码
function (exports, require, module, _filename, _dirname) {
}
实际上模块中的代码都是包装在一个函数中执行的,并且在函数执行时,同时传递进了5个实参:
- exports
-- 该对象用来将变量或函数暴露到外部
- require
-- 函数,用来引入外部的模块
- module
-- module代表的是当前模块本身,exports就是module的属性
- 既可以使用exports导出,也可以使用module.exports导出
- filename
-- 当前模块的完整路径
- dirname
-- 当前模块的目录文件夹
## exports和module.export
- 通过exports只能使用.的方式来向外暴露内部变量
`exports.XXX=XXX`
- 而`module.exports`既可以通过.的形式,也可以直接赋值
`module.exports.XXX=XXXX`
`module.exports ={}`
## 包基础
- CommonJS的包规范允许我们将一组相关的模块组合到一起,形成一组完整的工具。CommonJS的包规范由**包结构**和**包描述文件**两个部分组成。
- 包结构
-- 用于组织包中的各种文件
- 包描述文件
-- 描述包的相关信息,以供外部读取分析
### 包结构
-- 包实际上就是一个压缩文件,解压以后还原为目录。符合规范的目录,应该包含如下文件:
- package.json 描述文件(必须存在的文件)
- bin 可执行二进制文件
- lib js代码
- doc 文档
- test 单元测试
## NPM(Node Package Manager)
- CommonJS包规范是理论,NPM是其中一种实践。
对于Node而言,NPM帮助其完成了第三方模块的发布、安装和依赖等。借助NPM,Node与第三方模块之间形成了很好的一个生态系统。
## 模块的标识
-- 模块的标识就是模块的名字或路径
- 我们node通过模块的标识来寻找模块的
- 对于核心模块〈npm中下载的模块),直接使用模块的名字对其进行引入
- `var fs =require ( "fs");`
- `var express =require ("express");`
- 对于自定义的文件模块,需要通过文件的路径来对模块进行引入,路径可以是绝对路径,如果是相对路径必须以./或../开头:`var router = require("./router" );`
## npm的命令
- npn -v查看npm的版本
- npmn version查看所有模块的版本 npm search包名搜索包
- npm install / i 包名 安装包
- npm remove / r 包名 删除包
- npm install 包名--save 安装包并添加到依赖中
- npm install 下载当前项目所依赖的包
- npm install 包名 -g 全局安装包(全局安装包一般是一些工具)
## node搜索包的流程
- 通过npm下载的包都放到node_modules文件夹中
我们通过npm下载的包,直接通过包名引入即可
- node在使用模块名字来引入模块时,它会首先在当前目录的node_modules中寻找是否含有该模块
如果有则直接使用,如果没有则去上一级目录的node_modules中寻找,如果有则直接使用,如果没有则再去上一级目录寻找,直到找到为止直到找到磁盘的根目录,如果依然没有,则报错
## Buffer (缓冲区)
- Buffer的结构和数组很像,操作的方法也和数组类似
- 数组中不能存储二进制的文件,而buffer就是专门用来存储二进制数据-使用buffer不需要引入模块,直接使用即可
- 在buffer中存储的都是二进制数据,但是在显示时都是以16进制的形式显示,buffer中每一个元素的范围是从00 - ff
- 00000000 - 11111111
- 计算机一个0或一个1我们称为1位(bit)
- 8bit = 1byte(字节)
- buffer中的一个元素,占用内存的一个字节
- `Buffer.from (str)`将一个字符串转换为buffer
- `Buffer.alloc (size)`创建一个指定大小的Buffer
- `Buffer.alloUnsafe(size)`创建一个指定大小的Buffer,但是可能包含敏感数揖
- `Buffer.tostring()`(将缓冲区中的数据转换为字符串
## fs文件系统
- 文件系统(File system)
- 文件系统简单来说就是通过Node来操作系统中的文件
- 使用文件系统,需要先引入fs模块,fs是核心模块,直接引入不需要下载
- 同步和异步调用
- fs模块中所有的操作都有两种形式可供选择同步和异步。
- 同步文件系统会阻塞程序的执行,也就是除非操作完毕,则不会向下执行代码,函数名带有sync
- 异步文件系统不会阻塞程序的执行,而是在操作完成时,通过回调函数将结果返回,函数名不带sync
### 同步文件写入
- 手动操作的步骤
1. 打开文件
fs.opensync(path, flag[,mode])
- path要打开文件的路径
- flags 打开文件要做的操作的类型
-- r只读的
-- w可写的
- mode设置文件的操作权限,一般不传返回值:
- 该方法会返回一个文件的描述符作为结果,我们可以通过该描述符来对文件进行各种操作
2. 向文件中写入内容
fs.writesync(fd, stringl , position [ ,encoding] ] )
- fd文件的描述符,需要传递要写入的文件的描述符
- string要写入的内容
- position写入的起始位置
- encoding 写入的编码,默认utf-8
3. 保存并关闭文件
fs.closesync (fd)
- fd要关闭的文件的描述符
【example】
let fs = require('fs');
let res = fs.openSync('./JS/1.txt','w');
console.log(res);
fs.writeSync(res, '小肥');
fs.closeSync(res);
### 异步文件的写入
// fs文件系统 异步写入
let fs = require('fs');
fs.open("1.txt",'w', function(err, fd){
if (!err) {
fs.write(fd, '这是一段文字', function(err){
if(!err) {
console.log("写入成功");
fs.close(fd, function(err){
if (!err) {
console.log("成功");
} else {
console.warn(err);
}
});
} else {
console.warn(err);
}
});
} else {
console.warn(err);
}
});
### 简单文件写入
fs.writeFile(file, data [ , options] , callback )fs.writeFilesync(file, data [ , options ] )
- file要操作的文件的路径
- data要写入的数据
- options 选项,可以对写入进行一些设置
- callback当写入完成以后执行的函数
let fs = require('fs');
fs.writeFile("./JS/1.txt", "11",{flag:'a'},(err)=>{
if (err) {
console.warn(err);
} else {
console.log("ok");
}
})
### 流文件写入
- 同步、异步、简单的写入都不适合大文件的写入,性能较差,容易导致内存溢出
// 流式文件写入
// 导入fs
var fs = require('fs');
// 创建一个可写流
var ws = fs.createWriteStream('1.txt');
// 可以通过监听流的open和close事件来监听流的打开和关闭
ws.once("open", function(){
console.log("123");
})
// 通过ws向文件中输出内容
ws.write('111通过可写流写入的');
ws.write('22通过可写流写入的');
ws.write('33通过可写流写入的');
ws.write('44通过可写流写入的');
ws.write('55通过可写流写入的');
ws.end();
### 简单文件读取
1.同步文件读取2.异步文件读取3.简单文件读取
fs.readFile(path [ , options] , callback)fs .readFilesync(path [ , options] )
- path要读取的文件的路径
- options读取的选项
- callback回调函数,通过回调函数将读取到内容返回(err,data)
-- err错误数据
-- data读取到的数据,会返回一个Buffer
let fs = require('fs');
fs.readFile('1.txt',(err, data)=>{
if (err) {
console.warn(err);
} else {
console.log(data.toString());
fs.writeFile('10.txt',data, (err)=>{
if (err) {
console.warn(err);
} else {
console.log('ok');
}
})
}
});
4. 流式文件读取
- 流式文件读取也适用于一些比较大的文件,可以分多次文件读取到内存
// 流文件读取
var fs = require('fs');
// 创建一个可读流
var rs = fs.createReadStream("package.json");
var ws = fs.createWriteStream("1.txt");
rs.once("close", function(){
rs.close();
})
rs.on("data", function(data){
console.log(data);
ws.write(data);
ws.end();
});
// rs.pipe(ws);
标签:node,文件,fs,err,--,写入,js,模块
From: https://www.cnblogs.com/feiru-cnblogs/p/17146795.html