nodejs模块之fs&&stream

Posted 学如逆水行舟,不进则退。

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nodejs模块之fs&&stream相关的知识,希望对你有一定的参考价值。

nodejs的文件系统fs模块,可以实现对文件、目录等的操作,stream模块实现对文件数据的断续读写操作

一、文件操作

fs.readFile(file[,options],callback)  异步读取数据,参数err,data

fs.readFileSync(file[,options])  同步读取数据,返回读取的数据

fs.writeFile(file, data[,options],callback)  异步写数据,参数err

fs.writeFileSync(file,data[,options])  同步写数据,返回undefined

fs.stat(path,callback)  返回一个stats对象到回调函数参数中, 通过该stats对象获取文件信息,参数err,stats

fs.statSync(path)  同步,返回一个stats对象

------------------------------------------------------------------

stats对象获取信息方法:

stats.isFile()   是否为文件
stats.isDirectory()   是否为目录(文件夹)
stats.isBlockDevice()
stats.isCharacterDevice()
stats.isSymbolicLink() (only valid with fs.lstat())
stats.isFIFO()
stats.isSocket()

-------------------------------------------------------------

在index.js同级目录下创建一个file.txt, 里面填写数据作为测试用,比如Hello World

1、fs.readFile

"use srict";

const fs = require(‘fs‘);

fs.readFile(‘./file.txt‘, ‘utf-8‘, function (err, data) {
    if (err) {
        console.log(err);
        return;
    }
    console.log(data);
});

 

2、fs.readFileSync

"use srict";

const fs = require(‘fs‘);

const data = fs.readFileSync(‘./file.txt‘, ‘utf-8‘);
console.log(data);

 

3、fs.writeFile

读取file.txt文件数据,然后写到data.txt文件中,如果data.txt不存在,会自动创建然后写入,如果存在会先删除data.txt中数据,然后写入覆盖。

"use srict";

const fs = require(‘fs‘);

fs.readFile(‘./file.txt‘, ‘utf-8‘, function (err, data) {
    if (err) {
        console.log(err);
        return;
    }
    fs.writeFile(‘./data.txt‘, data + ‘ from file.txt‘, ‘utf-8‘, function (err) {
        if (err) {
            console.log(err);
            return;
        }
        console.log(‘write success‘);
    })
});

 

4、fs.stat

"use srict";

const fs = require(‘fs‘);

fs.stat(‘./file.txt‘, (err, stats) => {
    if (err) {
        console.log(err);
        return;
    }else {
        if (stats.isFile()) {
            fs.readFile(fileName, ‘utf-8‘, (err, data) => {
                if (err) {
                    console.log(err);
                    return;
                }
                fs.writeFile(‘./swFile.txt‘, data + ‘from file.txt by stat‘, ‘utf-8‘, (err) => {
                    if (err) {  
                        console.log(err);
                        return;
                    }
                    console.log(‘write success stat‘);
                })
            });
        } else {
            console.log(‘The file is dirtory‘);
        }
    }
});

 

二、文件夹操作

fs.mkdir(path[,mode],callback)  创建文件夹,参数mode指的是文件夹权限,参数err

fs.mkdirSync(path[,mode])  同步创建文件夹,返回undefined

fs.readdir(path[,options],callback)  读取文件夹,返回一个数组到回调参数,包含该文件夹所有子内容的名字string,不包括子孙内容,参数err, dir

fs.readdirSync(path[,options])  同步读取文件夹,返回读取的文件夹数组数据

"use srict";

const fs = require(‘fs‘);

fs.readdir(‘./fsDemo‘, function (err, dir) {
    if (err) {
        console.log(err);
        return;
    }
    console.log(dir); // [‘demo01‘, ‘demo02‘]
});

 

四、流操作(stream模块)

fs.createReadStream(path[,options])  创建一个读流操作对象,返回一个readable对象

-------------------------------------------------------

readable对象支持的事件:

data:当有数据读取的时候,返回读取的数据到回调函数参数中

readable:当有数据可读取的时候触发,但不会读取数据,仅仅做判断用

end:当数据全部读取完毕的时候触发

readable对象支持的方法:

rs.pause()  暂停读取数据

rs.resume()  打开读取流,恢复读取数据

rs.read()  读取当前剩余数据并返回,没有则返回null

 

options 是一个对象或者字符串,各个默认值为

{
  flags: ‘r‘,
  encoding: null,
  fd: null,
  mode: 0o666,
  autoClose: true
}

---------------------------------------------------

fs.createWriteStream(path[,options])  写流操作,返回一个writable对象

---------------------------------------------------

writable支持的事件:

finish:当end方法被调用,且所有数据都写入完毕时触发

pipe:当对象通过pipe写入数据时

writable对象支持的方法:

ws.write(chunk[,encoding][,callback])  写数据,chunk是要写入的数据(string|buffer) callback:写入后回调函数

ws.end()  关闭写入流

----------------------------------------------------

pipe方法:

rs.pipe(ws) 从左向右看,创建一个管道,将rs读取的数据通过管道流入到ws写入

-----------------------------------------------------------------------------------------------------------

fs.createReadStream

"use srict";

const fs = require(‘fs‘);

const rs = fs.createReadStream(‘./file.txt‘, ‘utf-8‘);
// 当读取数据时触发,将读取的数据打印
rs.on(‘data‘, function (data) {
    console.log(data);
});
// 当有数据可读是,将剩余数据全部打印出来
rs.on(‘readable‘, function() {
    console.log(rs.read())
});
// 当读取结束时,打印read finished
rs.on(‘end‘, function () {
    console.log(‘read finished‘);
});

 

fs.createWriteStream

"use strict";

const fs = require(‘fs‘);

const rs = fs.createReadStream(‘./file.txt‘, ‘utf-8‘); 
const ws = fs.createWriteStream(‘./data.txt‘, {
    flags: ‘w‘, // a 追加,w 删除后再写,默认为w
    
});
// 当读取数据时触发,将读取的数据写入
rs.on(‘data‘, function (data) {
    ws.write(data);
});
// 当读取数据结束时,关闭写入流,打印write end
rs.on(‘end‘, function (data) {
    ws.end();
    console.log(‘write end‘);
});

// 其实可以通过pipe方法,一句代码实现上边的功能,如下
// rs.pipe(ws);

 

 

 

 

 

-------------------------------------------------------------------------------------end

以上是关于nodejs模块之fs&&stream的主要内容,如果未能解决你的问题,请参考以下文章

nodejs模块之http&&url

nodejs之fs模块

nodejs入门API之fs模块

nodejs之fs模块

每日灵魂一问-Nodejs文件查找的优先级&Require 方法的文件查找策略?

NodeJS入门:常用模块汇总之(path / fs / os / url模块)