Node.js-fs读写文件API

文件系统简单来说就是通过Node来操作系统中的文件
使用文件系统,需要先引入fs模块,fs是核心模块,直接引入不需要下载

异步和同步

Node.js 文件系统(fs 模块)模块中的方法均有异步和同步版本,例如读取文件内容的函数有异步的 fs.readFile() 和同步的 fs.readFileSync()。

异步的方法函数最后一个参数为回调函数,回调函数的第一个参数包含了错误信息(error)。

建议大家使用异步方法,比起同步,异步方法性能更高速度更快,而且没有阻塞

文件的写入

同步

writeFileSync()

将要写入的文件内容完整的读入缓存区,然后一次性的将缓存区中的内容写入都文件中(一次全部传完)

writeFileSync(file, data[, options])

使用同步的方式读取数据,且读取的内容通过返回值获取。

  • file 要操作的文件的路径

  • data 要写入的数据

  • options 选项,默认为null 也可直接传入 encoding

    • encoding 编码,默认为 utf8

    • flag 标识位,默认为 w

    • mode 权限位,默认为 0o666

//引入fs模块
var fs = require("fs");
fs.writeFile(
  "hello3.txt",
  "这是通过writeFile写入的内容",
  { flag: "a" },
  function (err) {
    if (!err) {
      console.log("文件写入成功");
    }
  }
);

writeSync()

将需要写入的数据写入到一个内存缓存区,待缓存区写满后再将缓存区中的内容写入到文件中

1.打开文件

fs.openSync(path, flags[, mode])

  • path 要打开文件的路径

  • flags 打开文件要做的操作的类型

    • r 只读的

    • w 可写的

  • mode 设置文件的操作权限,一般不传

  • 返回值:该方法会返回一个文件的描述符作为结果,我们可以通过该描述符来对文件进行各种操作

2.向文件中写入内容

fs.writeSync(fd, string[, position[, encoding]])

  • fd 文件的描述符,需要传递要写入的文件的描述符

  • string 要写入的内容

  • position 写入的起始位置

  • encoding 写入的编码,默认utf-8

3.保存并关闭文件

fs.closeSync(fd)

  • fd 要关闭的文件的描述符

eg:

var fs = require("fs");

//打开文件
var fd = fs.openSync("hello.txt", "r");

//向文件中写入内容
fs.writeSync(fd, "今天天气真不错~~~");

//关闭文件
fs.closeSync(fd);

console.log("程序向下执行~~~");

异步

writeFile()

writeFile(file, data[, options], callback)

将要写入的文件内容完整的读入缓存区,然后一次性的将缓存区中的内容写入都文件中(一次全部传完,文件过大就会影响效率)

  • file 要操作的文件的路径

  • data 要写入的数据

  • options 选项,可以对写入进行一些设置

  • callback 当写入完成以后执行的函数

    • flag

      • r 只读

      • w 可写

      • a 追加

const fs = require("fs");
 
fs.writeFile("2.txt", "Hello world", err => {
    if (!err) {
        fs.readFile("2.txt", "utf8", (err, data) => {
            console.log(data); // Hello world
        });
    }
});

write()

将需要写入的数据写入到一个内存缓存区,待缓存区写满后再将缓存区中的内容写入到文件中(分批次,存满一个传一个)

1.打开文件

fs.open(path, flags[, mode], callback)

  • path:要打开文件的路径

  • flags:打开文件要做的操作的类型

    • r 只读的

    • w 可写的

  • mode:设置文件的操作权限,一般不传

  • callback:err错误对象,如果没有错误则为null

2.向文件中写入内容

fs.write(fd, string[, position[, encoding]], callback)

  • fd 文件的描述符,需要传递要写入的文件的描述符

  • string 要写入的内容

  • position 写入的起始位置

  • encoding 写入的编码,默认utf-8

  • callback:err错误对象,如果没有错误则为null

3.保存并关闭文件

fs.close(fd, callback)

  • fd 要关闭的文件的描述符

eg:

//引入fs模块
var fs = require("fs");
//打开文件
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("程序向下执行")
//异步执行不会阻塞,所以最下面的 ”程序向下执行“ 最先输出

/*输出为:
  程序向下执行
  写入文件成功
  文件关闭成功
*/

读取文件

同步

readFileSync()

readFileSync(path[, options])

  • path 要读取的文件的路径

  • options 读取的选项,默认值为 null,其中有 encoding(编码,默认为 null)和 flag(标识位,默认为 r),也可直接传入 encoding

若现在有一个文件名为 1.txt,内容为 “Hello”,现在使用 readFileSync 读取。

const fs = require("fs");
 
let buf = fs.readFileSync("1.txt");
let data = fs.readFileSync("1.txt", "utf8");
 
console.log(buf); // 
console.log(data); // Hello

readSync()

readSync(fd, buffer, offset, length, position)

方法将返回一个 bytesRead (读取的字节数)

  • fd:文件描述符,需要先使用 open 打开;

  • buffer:存储将要写入文件数据的 Buffer;

  • offset:整数,从 Buffer 读取数据的初始位置;

  • length:整数,读取 Buffer 数据的字节数;

  • position:整数,写入文件初始位置;

下面读取一个 6.txt 文件,内容为 “你好”。

var fs = require("fs");
let buf = Buffer.alloc(6);
fs.open("6.txt", "r", function (err, fd) {
  if (err) {
    console.error(err);
    return;
  }
  var bytesRead = fs.readSync(fd, buf, 0, 6, 0);
  console.log(bytesRead);
  console.log(buf);
  console.log(buf.toString());
});

// 6
// 
// 你好

异步

readFile()

readFile(path[, options], callback)

  • 前两个参数同上相同

  • callback回调函数,通过回调函数将读取到内容返回(err , data)

    • err 错误对象

    • data 读取到的数据,会返回一个Buffer

依然读取 1.txt 文件:

const fs = require("fs");
 
fs.readFile("1.txt", "utf8", (err, data) => {
    console.log(err); // null
    console.log(data); // Hello
});

read()

read 方法与 readFile 不同,一般针对于文件太大,无法一次性读取全部内容到缓存中或文件大小未知的情况,都是多次读取到 Buffer 中。

read(buffer, offset, length, position)

  • fd:文件描述符,需要先使用 open 打开;

  • buffer:存储将要写入文件数据的 Buffer;

  • offset:整数,从 Buffer 读取数据的初始位置;

  • length:整数,读取 Buffer 数据的字节数;

  • position:整数,写入文件初始位置;

  • callback:回调函数,写入完成后执行。

    • err(错误)

    • bytesWritten(实际写入的字节数)

    • buffer(被读取的缓存区对象)

下面读取一个 6.txt 文件,内容为 “你好”。

const fs = require("fs");
let buf = Buffer.alloc(6);
 
// 打开文件
fs.open("6.txt", "r", (err, fd) => {
    // 读取文件
    fs.read(fd, buf, 0, 3, 0, (err, bytesRead, buffer) => {
        console.log(bytesRead);
        console.log(buffer);
 
        // 继续读取
        fs.read(fd, buf, 3, 3, 3, (err, bytesRead, buffer) => {
            console.log(bytesRead);
            console.log(buffer);
            console.log(buffer.toString());
        });
    });
});
 
// 3
// 
 
// 3
// 
// 你好

流式文件的写入 —— 推荐

同步、异步、简单文件的写入都不适合大文件的写入,性能较差,容易导致内存溢出

fs.createWriteStream(path[, options])

  • path,文件路径

  • options 配置的参数

可以通过监听流的open和close事件来监听流的打开和关闭

var fs = require("fs");

//流式文件写入
//创建一个可写流
var ws = fs.createWriteStream("hello3.txt");

//可以通过监听流的open和close事件来监听流的打开和关闭
/*
  on(事件字符串,回调函数)
    - 可以为对象绑定一个事件

  once(事件字符串,回调函数)
    - 可以为对象绑定一个一次性的事件,该事件将会在触发一次以后自动失效

**/
ws.once("open",function () {
  console.log("流打开了~~~");
});

ws.once("close",function () {
  console.log("流关闭了~~~");
});

//通过ws向文件中输出内容
ws.write("通过可写流写入文件的内容");
ws.write("今天天气真不错");
ws.write("锄禾日当午");
ws.write("红掌拨清清");
ws.write("清清真漂亮");

//关闭流
ws.end();

流式文件的读取

fs.createReadStream(path[, options])

流式文件读取也适用于一些比较大的文件,可以分多次将文件读取到内存中

  • path,文件路径

  • options 配置的参数

var fs = require("fs");
//创建一个可读流
var rs = fs.createReadStream("hello3.txt");

//创建一个可写流
var ws = fs.createWriteStream("hello5.txt");

//监听流的开启和关闭
rs.once("open", function () {
  console.log("可读流打开了~~");
});
rs.once("close", function () {
  console.log("可读流关闭了~~");
});

ws.once("open", function () {
  console.log("可写流打开了~~");
});
ws.once("close", function () {
  console.log("可写流关闭了~~");
  ws.end();
});

// pipe()可以将可读流中的内容,直接输出到可写流中
rs.pipe(ws);

你可能感兴趣的:(Node.js,node.js,javascript)