一、node.js是什么?
node.js 是一个基于 Chrome V8 引擎的 JavaScirpt 运行环境。
二、优点及缺点
优点:Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,异步编程,使其轻量又高效。
缺点:单进程,单线程,只支持单核cpu,不能充分的利用多核cpu服务器。一旦这个进程崩掉,那么整个web服务就崩掉了。
三、基本使用
require()引入模块,返回一个模块对象;
module.exports()或者exports() 导出一个对象;
module.exports 与 exports 有什么区别?
一开始两者指向同一个空间,如果给两者分别赋值(指向不同的对象的时候),优先导出module.exports这个对象,使用时最好使用module.exports。
var md=require("math");
console.log(md.add(123,456));
console.log(md.mul(123,456));
//一个汉字在Buffer中占3个字节
var str="Hello world";
//将一个字符串存到Buffer中
var buf=Buffer.from(str);
//在Buffer中存储的都是二进制,但是在显示的时都是以16进制的形式显示
console.log(buf);
console.log(buf.length);//占内存大小
console.log(str.length);//字符串str长度
//创建一个指定大小的Buffer
var buf2=new Buffer(10);
console.log(buf2)//10个字节的Buffer
//创建一个10个字节大小的Buffer
var buf3=Buffer.alloc(10);
//听过索引,操作buf3中元素
buf3[0]=88;
buf3[1]=88;
buf3[2]=0xaa;
buf3[9]=188;
buf3[10]=188;//Buffer大小一旦确定,不能修改
console.log(buf3);
//只要数字在控制台或页面中输出的一定是10进制
//Buffer.from()将一个字符串转化为Buffer
var fs=require("fs");
console.log(fs);
/* 同步文件的写入
-手动55操作的步骤
1.打开文件
fs.openSync(path,flags[,mode])
-path 要打开文件的路径
-flags 打开文件要做的操作的类型
r只读的
w 可写的
-mode 设置文件的操作权限,一般不传
返回值
-该方法返回一个文件的描述符作为结果,我们可以通过该文件的描述符来对文件进行各种操作
2.想文件中写入内容
fs.writeSync(fd, string[, position[, encoding]])
-fd 文件的一个描述符,需要传递需要写入文件的描述符
-string 要写入的内容
3.保存并关闭文件
fs.closeSync(fd);
-fd 要关闭文件的描述符
*/
//打开文件
var fd=fs.openSync("hello.txt","w");
//向文件中写入内容
fs.writeSync(fd,"今天天气真好~~~",20);
//关闭文件
fs.closeSync(fd);
/* 异步文件的写入
fs.openSync(path,flags[,mode],callback)
-异步调用的方法,结果都通过回调函数的参数返回的
-回调函数两个参数;
err 错误对象,如果没有错误则为null
fd 文件的描述符
fs.writeSync(fd, string[, position[, encoding]],callback)
-用来异步写入一个文件
*/
fs.open("hello2.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.log("err");
}
});
console.log("程序向下运行~~");
/*
-file 要操作的文件的路径
-data 要写入的数据
-options 选项,可以对写入进行一些设置
-callback 当写入完成以后执行的函数
*/
var fs=require("fs");
fs.writeFile("hello3,txt","这是通过writeFile写入的内容",{flag:"a"},function(err){
if(!err){
console.log("写入成功~~~");
}else{
console.log(err);
}
})
//同步,异步,简单文件的写入都不适合大文件的写入,性能较差,容易导致内存溢出
/*流式文件写入
创建一个可写流
fs.createWriteStream(path[,options])
-可以用来创建一个可写流
-options 配置的参数
*/
var ws =fs.createWriteStream("hello3.txt");
/*
on(事件字符串,回调函数)
-可以为对象绑定一个事件
once(事件字符串,回调函数)
-可以为对象绑定一个一次性事件,该事件将会在触发一次以后自动失败
*/
//可以通过监听流的open和close事件来监听可写流的打开和关闭
ws.once("open",function () {
console.log("流打开了~~");
})
ws.once("close",function () {
console.log("流关闭了~~");
})
//通过ws向文件中输入内容
ws.write("通过可写流写入文件的内容");
ws.write("通过可写流写入文件的内容");
ws.write("通过可写流写入文件的内容");
//关闭流
ws.end();
/*
1.同步文件读取
2.异步文件读取
3.简单文件读取
fs.readFile(path[, options], callback)
fs.readFileSync(path[, options])
data 读取的数据,会返回一个Buffer
4.流式文件读取
也适用于一些比较大的文件,可以分多次将文件读取到文件中
*/
var fs=require("fs");
fs.readFile("hello3.txt",function (err,data) {
if(!err){
console.log(data);
console.log(data.toString());
}
})
var rs=fs.createReadStream("hello3,txt");
var ws=fs.createWriteStream("hello3,txt");
// rs.once("open",function () {
// console.log("可读流打开了~~");
// })
// rs.once("close",function () {
// console.log("可读流关闭了~~");
// })
// //如果要读取一个可读流中的数据,必须要为可读流绑定一个data事件,data事件绑定完毕,它会自动开始读取数据
// rs.on("data",function (data) {
// console.log(data);
// })
//pipe()可以将可读流中的内容,直接输入可写流中
rs.pipe(ws);