Node.js简介
- Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。 Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型。
- Node 是一个让 JavaScript 运行在服务端的开发平台,它让 JavaScript 成为与PHP、Python、Perl、Ruby 等服务端语言平起平坐的脚本语言。
- 发布于2009年5月,由Ryan Dahl开发,实质是对Chrome V8引擎进行了封装。
Node对一些特殊用例进行优化,提供替代的API,使得V8在非浏览器环境下运行得更好。V8引擎执行Javascript的速度非常快,性能非常好。 - Node是一个基于Chrome JavaScript运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node 使用事件驱动, 非阻塞I/O 模型而得以轻量和高效,非常适合在分布式设备上运行数据密集型的实时应用。
下载安装
Node.js 安装包及源码下载地址为:https://nodejs.org/en/download/
Node.js最大的特点就是异步式I/O(或者非阻塞I/O)与事件紧密结合的编程模式。这种模式与传统的同步式I/O线性的编程思路有很大的不同,因为控制流很大程度上要靠事件和回调函数来组织,一个逻辑要拆分为若干个单元。
fs
node 操作文件流 fs 同步与异步 流式文件的写入与读取
fs ( File System ) 文件系统
在node中通过fs模块来和系统中的文件进行交互
通过fs模块可以对磁盘中的文件做各种增删改查的操作
写入文件
1.同步写入
2.异步写入
3.简单写入
4.流式写入
读取文件
在fs模块中所有的方法都有两个版本
不带sync的,异步方法
带sync的,同步方法
1.同步写入
**1.打开要写入的文件**
fs.openSync(path, flags[, mode])
该方法用来打开一个文件
参数:
path:路径,要打开文件的路径
flags:操作的类型,要对文件做什么操作
需要字符串作为参数
"w" 写
"r" 读
"a" 追加
mode:可选参数,一般不传,用来设置文件的权限
返回值:
fd 文件的描述符
2.写入并保存
fs.writeSync(fd, string[, position[, encoding]])
该方法用于向文件中写入内容
参数:
fd: 文件的描述符,需要指定要写入文件的描述符
string: 要写入的内容
position: 开始写入的位置
encoding: 写入内容的字符编码,默认utf-8
3.关闭文件
fs.closeSync(fd):: 该方法用来关闭文件
参数:
fd 文件的描述符
实例
//引入fs模块
var fs=require('fs');
var fd=fs.openSync('gzl.txt','w');
fs.writeSync(fd,'1111',10,'utf-8');
fs.closeSync(fd);
2.简单文件的写入
简单文件写入
fs.writeFile(file, data[, options], callback)
fs.writeFileSync(file, data[, options])
- 参数:
file 要写入的文件的路径
data 要写入的内容
options 配置对象(可选)
encoding 编码 默认 utf8
flag 操作类型 默认 w
mode 文件的权限 默认666,一般不需要传
callback 回调函数,写入完成后会调用该函数
3.异步写入
1.打开文件
fs.open(path, flags[, mode], callback)
参数:callback
回调函数,会在文件打开以后执行
回调函数中会有两个参数:
err: 错误信息,如果操作过程中出现了错误,则该对象存在,如果没有出现错误,则该参数的值为null
错误优先
fd: 文件的描述符
2.写入文件
fs.write(fd, string[, position[, encoding]], callback)
callback 回调函数会在写入完毕以后执行
参数:
err 错误对象
byte 写入的字节数
data 写入的数据
3.关闭文件
fs.close(fd, callback)
异步写入的相关代码:::
var fs=require('fs');
fs.open('gzl.txt','a',function (err,fd) {
if (!err){
fs.write(fd,'ffffff',10,function (err,bite,data) {
if (!err){
console.log('文件写入成功');
};
fs.close(fd,function (err) {
if (!err){
console.log('文件已关闭');
};
});
});
};
});
4.流式文件的写入与读取流式文件写入
流式文件写入
其他的文件的写入方式都是一次性将一个内容写入到文件中的,
如果文件太大了则会导致运行速度过慢,会严重影响程序的性能
流式文件写入适合较大的文件写入,可以分多次将多个内容输出到文件中
相关代码:
//创建一个可写流(WriteStream)
var ws = fs.createWriteStream("hello3.txt");
//为流绑定一个open和close事件,来监听流是否打开和关闭
ws.once("open",function () {
console.log("流打开了~~~");
});
ws.once("close",function () {
console.log("流关闭了~~~");
});
//通过可写流向文件中输出内容
ws.write("O(∩_∩)O哈哈~");
ws.write("O(∩_∩)O~");
//关闭流
ws.end();
流式文件读取
适合较大的文件读取
相关代码:
//创建一个可读流
var rs = fs.createReadStream("C:\\Users\\lilichao\\Desktop\\笔记.mp3");
//创建一个可写流
var ws = fs.createWriteStream("a.mp3");
//监听流的状态
rs.once("open",function () {
console.log("可读流已经打开");
});
rs.once("close",function () {
console.log("可读流已经关闭");
//关闭可写流
ws.end();
});
ws.once("open",function () {
console.log("~~~~可写流已经打开");
});
ws.once("close",function () {
console.log("~~~~可写流已经关闭");
});
//要读取一个可读流中的数据,必须要给该流绑定一个data事件
//绑定data事件后,流会自动读取数据,数据读取完毕以后,流会自动关闭
//读取到的数据会通过回调函数的参数的形式返回
rs.on("data",function (data) {
//console.log(data.length);
//将数据线写入到可写流中
ws.write(data);
});
简单方法::
//创建一个可读流
var rs = fs.createReadStream("C:\\Users\\lilichao\\Desktop\\笔记.mp3");
//创建一个可写流
var ws = fs.createWriteStream("b.mp3");
//将可读流中的数据写入到可写流中
rs.pipe(ws);
5.其他读取文件
相关代码:
/*
验证路径是否存在
fs.existsSync(path)
获取文件信息
fs.stat(path, callback)
fs.statSync(path)
删除文件
fs.unlink(path, callback)
fs.unlinkSync(path)
*/
var result = fs.existsSync("ab.jpg");
//console.log(result);
fs.stat("a.jpg", function (err , stats) {
if(!err){
//stats 是一个对象,在该对象中保存了当前文件的状态信息
/*
通过该对象可以获取文件的状态
stats.size 获取文件的大小
stats.isFile() 是否是文件
stats.isDirectory()是否是目录
*/
//console.log(stats.isDirectory());
}
});
//删除文件
//fs.unlinkSync("hello.txt");
/*
列出文件
fs.readdir(path[, options], callback)
fs.readdirSync(path[, options])
截断文件
fs.truncate(path, len, callback)
fs.truncateSync(path, len)
建立目录
fs.mkdir(path[, mode], callback)
fs.mkdirSync(path[, mode])
*/
/*
fs.readdir(".",function (err , files) {
if(!err){
//files是一个保存了目录下文件(夹)名字的string数组
console.log(files[0]);
}
});*/
//截断文件 将文件截断成指定的大小,会丢失数据
//fs.truncateSync("hello2.txt",10);
//创建目录
//fs.mkdir("hello");
/*
删除目录
fs.rmdir(path, callback)
fs.rmdirSync(path)
重命名文件和目录
fs.rename(oldPath, newPath, callback)
fs.renameSync(oldPath, newPath)
- 通过该方法也可以实现剪切的功能
监视文件更改写入
fs.watchFile(filename[, options], listener)
- 参数:
filename 文件名
options 配置对象
listener 回调函数,当前文件发生变化时,该函数将会执行
- curr 表示文件现在的状态
- prev 表示文件修改前的状态
- 这两个对象都是stats对象
*/
//fs.rmdir("hello");
/*fs.rename("b.mp3","C:\\Users\\lilichao\\Desktop\\b.mp3",function (err) {
if(!err){
console.log("修改成功");
}
});*/
fs.watchFile("hello2.txt",{interval:1000},function (curr,prev) {
console.log("当前文件的大小为: "+curr.size);
console.log("修改前文件的大小为: "+prev.size);
});