04小白学nodejs 文件写入

一个服务器的本质就是读写文件内容,提供文件内容给远程的客户端
node使用fs模块与文件做交互,fs是核心模块,无需下载,直接引入即可
文件写入的几种方式:同步,异步,简单方法,流式写入

先说一下同步和异步:

  • node中一般的API方法都有两种方式,同步和异步;
  • 同步会阻塞程序的执行,也就是调方法后,得等待方法得返回后,才能继续向下执行;
  • 异步调用是不等返回,先执行后面的代码,等有返回了,触发回调函数,返回的数据作为参数,传给回调;

同步写入

var fs = require('fs');

//1. 打开文件  fs.openSync(path, flags[, mode])  
var fd = fs.openSync("hello.txt", "w");//该方法会返回一个文件的资源描述符,可以通过该描述符来对文件进行各种操作
// console.log(fd);

//2. 写入内容  fs.writeSync(fd, buffer[, offset[, length[, position]]])
fs.writeSync(fd, "content...")

// 打开文件,写入数据后,此时打开的资源还在内存中,没关闭 会一直占用内存空间
//3. 关闭文件
fs.closeSync(fd)  

异步写入

异步不需要等待返回,返回的对象作为参数传给回调函数

var fs = require('fs');

//打开一个文件 
fs.open("hello.txt", 'w', function(err, fd){//交给后台的IO线程池执行,不阻塞,后续的代码继续执行,当后台IO线程打开文件后,返回结果到回调函数中
    // console.log(arguments);
    if(!err) {
        //console.log(fd);
        //如果没有出错,则对文件进行写入操作
        fs.write(fd, "这是异步写入的内容", function (err) {
            if(!err) {
                console.log('写入成功');
            }

            //关闭文件
            fs.close(fd, function(err){
                if(!err) {
                    console.log("文件已关闭");
                }
            })
        })
    } else {
        console.log(err);
    }
});

console.log("程序是异步的");

简单方式写入

fs.writeFile(file, data[, options], callback)
fs.writeFileSync()

var fs = require('fs');
fs.writeFile('hello.txt', 'haaaaaaaa', {flag:"a"}, function(err){
    if(!err) {
        console.log("写入成功...");
    } else {
        console.log(err);
    }
});

流式写入

  • 读写文件,就像从一个池子里往另一个池子里送水
  • 前面的异步,同步文件写入,都是一次性全部写入内容到一个文件中,但是有一个问题,我写入之前,得把所有得内容全都加载到内存中,然后再一次性写入,假如文件特别大,则内存无法一下子都缓存 (内存溢出)
  • 所以无论是同步,还是异步,都不适合大文件得写入
var fs = require('fs');

//创建一个可写流
var ws = fs.createWriteStream('hello.txt');//ws相当于连接到hello.txt得水管子

//通过ws这跟水管向hello.txt文件中输出内容
// ws.write("通过可写流写入文件得内容");
// ws.write("通过可写流写入文件得内容");
// ws.write("通过可写流写入文件得内容");
// ws.write("通过可写流写入文件得内容");
// ws.write("通过可写流写入文件得内容");
//流式写入,可以分多次把一个数据写入文件中,此时流并没有关闭,还可以继续写,当然也在继续占用系统资源
//对于流,需要对它得打开(open)和关闭(close)进行监听

//监听流的open事件
/*ws.on('open', function() {
    console.log('流打开了...');
});*/
//但是这里要注意,open事件只会触发一次(即open是一个一次性的事件),即流只会打开一次,所以这里用once绑定更好
//因为on绑定的函数,执行后,还依旧存在,而这里的打开仅是一次的动作,所以仅监听执行一次即可
//open打开监听执行函数完毕后,即可销毁,不用再次监听执行了。
//on一般是绑定一个长期有效的事件
//once(事件字符串,回调函数)   可以为对象绑定一个一次性的事件,该事件将会在触发一次以后,自动失效

ws.once('open', function(){
    console.log('流打开了...');
});
ws.once('close', function(){
    console.log('流关闭了...');
});

ws.write("1111111");
ws.write("2222222");
ws.write("3333333");

ws.end();//结束流,这里最好是不要使用ws.close();  其实end就是拔水管送水的这头,即都送给水管了,就可以拔了,存在水管中的水还是可以到接收池子里
//close相当于拔接收端,假如此时水管中还有水,则丢失了;可能会导致数据丢失
本作品采用《CC 协议》,转载必须注明作者和本文链接
六月的风
Junwind
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!