天天看点

Node学习笔记(四)Buffer缓冲区、文件写入Buffer缓冲区文件系统(fs)简单文件写入文件的打开状态流式文件写入

Buffer缓冲区

简介

buffer的结构和数组很像,操作也相似,buffer可以存储数组不能存储的二进制文件。使用buffer不许要引入,buffer存储的是二进制显示的是十六进制。 buffer在连续内存中,buffer大小一旦缺点不能修改,buffer底层内存直接操作。

  • buffer中每一个元素大小范围是从00000000-11111111(00-FF);
  • 计算机中存储耳朵0或1,成为1bit,8bit-1byte字节;
  • buffer中一个元素占用内存一个字节,也就是八位。
var str = "my task";
var buf = Buffer.from(str);
console.log(str);
console.log(buf)
           
Node学习笔记(四)Buffer缓冲区、文件写入Buffer缓冲区文件系统(fs)简单文件写入文件的打开状态流式文件写入

常用API

http://nodejs.cn/api/buffer.html

创建方法

var str = "my task";
//1、字符串转换
var buf1 = Buffer.from(str);
//2、通过构造方法创建长度为10的buffer,不推荐使用
var buf2 = new Buffer(10);
//3、通过类方法创建长度为10的buffer,最常用
var buf2 = Buffer.alloc(10);
//4、allocUnsafe方法也可以创建buffer,可能存在敏感数据,分配空间不清空数据,性能好
Buffer.allocUnsafe(10);
           

常用方法

var buf = Buffer.alloc(10);
//和数组类似用[]的形式给buffer赋值,默认十进制,0x表示十六进制
buf[0] = 89;
buf[1] = 0xaa;
//buffer中存储的是二进制,直接打印buffer显示的是十六进制,打印某一个元素显示的是十进制
console.log(buf[0]);//89
console.log(buf[1]);//170
console.log(buf);//<Buffer 59 aa 00 00 00 00 00 00 00 00>
//使用toString(16)转换成16进制输出
console.log(buf[1].toString(16));//aa
//对buffer使用toString()方法显示buffer中存储的字符
console.log(buf.toString());//Y�
//如果输入超过255,则会在转换成二进制以后仅保留后八位
buf[2] = 257;
console.log(buf[2]);//1
           

文件系统(fs)

常用API: http://nodejs.cn/api/fs.html

通过node操作系统文件,node中文件系统交互非常重要,服务器本身就是将本地文件发送给远程客户端,node通过fs模块和文件系统进行交互。该模块提供一些标准文件访问API来打开读取和写入文件与其交互。需要引入,核心模块不需要下载。

同步和异步

fs所有方法都有两种形式可供选择同步和异步,异步都有callback参数。同步文件系统会阻塞,异步不会阻塞,而是操作完成时通过回调函数将结果返回。

同步文件写入

//文件写入fs模块
var fs = require("fs");
//打开文件fs.openSync(path[,flags,model]) -path路径;flags(w可写的r可读的);
//model设置权限;返回文件描述作为结果
var fd = fs.openSync("hello1.txt","w");//返回文件描述
console.log(fd);//3
//写文件fs.writeSync(fd,string[,postion[,encoding]]) -fd文件描述;
//string写入文件内容;postion写入起始位置;encoding编码 默认utf—8
fs.writeSync(fd,"今天天气不错",20,"UTF-8");
//关闭文件
fs.closeSync(fd);
           

异步文件写入

var fs = require("fs");
//打开文件 fs.open(path,flags,model,callBack) -callBack回调函数
//回调参数两个对象,err错误对象,如果没有则为null,fd文件描述
fs.open("hello2.txt","w",function(err,fd){
    if(!err){
        //文件写入fs.writeSync(fd,string,postion,encoding,callBack)
        fs.write(fd,"异步写入的内容",function(err){
            if(!err){
                console.log("写入成功");
            }
            //保存并关闭fs.close(fd,callBack)
            fs.close(fd,function(err){
                if(!err){
                    console.log("关闭成功");
                }
            });
        });
    }else{
        console.log(err);
    }
});
console.log("先执行的代码");
           

运行结果

Node学习笔记(四)Buffer缓冲区、文件写入Buffer缓冲区文件系统(fs)简单文件写入文件的打开状态流式文件写入

异步写入并不是顺序运行,文件传输不会引起线程阻塞,所以性能相对比同步要高。异步代码有异常处理,如果出现异常不会影响主流程。

简单文件写入

fs.writeFile(flie,data[,option],callback)//异步
fs.writeFileSync(flie,data[,option])//同步
           
  • file 要操作的路径
  • data写入的数据
  • callback回调函数
  • Node学习笔记(四)Buffer缓冲区、文件写入Buffer缓冲区文件系统(fs)简单文件写入文件的打开状态流式文件写入
    一般可以省略
var fs =require("fs");
fs.writeFile("h.txt","写入内容",function(err){
    console.log("success");
})
//相对路径
fs.writeFileSyns("h.txt","写入内容")
//绝对路径
fs.writeFileSyns("C:\\Users\\Administrator\\Desktoph.txt","写入内容")
fs.writeFileSyns("C:/Users/Administrator/Desktoph.txt","写入内容")
           

文件的打开状态

文件打开状态“w"默认是原来覆盖已经有的内容。

Node学习笔记(四)Buffer缓冲区、文件写入Buffer缓冲区文件系统(fs)简单文件写入文件的打开状态流式文件写入
fs.writeFileSyns("h.txt",{flag:"a"},"追加内容")
           

流式文件写入

同步、异步、简单文件写入都不适合大文件写入,容易出现内存问题。

// 创建可写流
fs.createReadStream(path[, options])
           
Node学习笔记(四)Buffer缓冲区、文件写入Buffer缓冲区文件系统(fs)简单文件写入文件的打开状态流式文件写入
var fs = require("fs");
//创建流
var ws = fs.createWriteStream("hello.txt");
ws.once("open",function(){
    console.log("流打开");
});
ws.once("close",function(){
    console.log("流关闭");
});
ws.write("流写入内容1");
ws.write("流写入内容2");
ws.write("流写入内容3");
ws.write("流写入内容4");
//关闭流
ws.end();