文件系统简单来说就是通过Node来操作系统中的文件
使用文件系统,需要先引入fs模块,fs是核心模块,直接引入不需要下载
Node.js 文件系统(fs 模块)模块中的方法均有异步和同步版本,例如读取文件内容的函数有异步的 fs.readFile() 和同步的 fs.readFileSync()。
异步的方法函数最后一个参数为回调函数,回调函数的第一个参数包含了错误信息(error)。
建议大家使用异步方法,比起同步,异步方法性能更高,速度更快,而且没有阻塞。
将要写入的文件内容完整的读入缓存区,然后一次性的将缓存区中的内容写入都文件中(一次全部传完)
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("文件写入成功");
}
}
);
将需要写入的数据写入到一个内存缓存区,待缓存区写满后再将缓存区中的内容写入到文件中
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)
eg:
var fs = require("fs");
//打开文件
var fd = fs.openSync("hello.txt", "r");
//向文件中写入内容
fs.writeSync(fd, "今天天气真不错~~~");
//关闭文件
fs.closeSync(fd);
console.log("程序向下执行~~~");
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
});
}
});
将需要写入的数据写入到一个内存缓存区,待缓存区写满后再将缓存区中的内容写入到文件中(分批次,存满一个传一个)
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)
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(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(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(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
方法与 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);