>[success] # 文件的写入
| API名称 | 描述 | 优点 | 缺点 |
| --- | --- | --- | --- |
| fs.writeFile() | 写入文件内容,如果文件不存在则创建文件,如果文件已存在则覆盖文件内容 | 简单易用,支持回调函数和Promise两种写法 | 无法指定写入文件的位置,无法实现数据追加 |
| fs.writeFileSync() | 同步地写入文件内容,如果文件不存在则创建文件,如果文件已存在则覆盖文件内容 | 简单易用,支持同步写法 | 阻塞IO操作,不适用于高并发场景 |
| fs.promises.writeFile() | 使用Promise对象写入文件内容,如果文件不存在则创建文件,如果文件已存在则覆盖文件内容 | 支持Promise链式调用,代码可读性好 | 无法指定写入文件的位置,无法实现数据追加 |
| fs.appendFile() | 将数据追加到文件中,如果文件不存在则创建文件 | 可以实现数据追加,支持回调函数和Promise两种写法 | 无法指定写入文件的位置,每次写入都需要遍历整个文件 |
| fs.appendFileSync() | 同步地将数据追加到文件中,如果文件不存在则创建文件 | 可以实现数据追加,支持同步写法 | 阻塞IO操作,不适用于高并发场景 |
| fs.promises.appendFile() | 使用Promise对象将数据追加到文件中,如果文件不存在则创建文件 | 可以实现数据追加,支持Promise链式调用,代码可读性好 | 无法指定写入文件的位置,每次写入都需要遍历整个文件 |
| fs.createWriteStream() | 创建一个可写流来写入数据到文件 | 可以指定写入文件的位置和实现数据追加,适用于大文件写入和高并发场景 | 适用于大文件写入和高并发场景,使用比较繁琐,需要多次调用该方法才能完成完整的写入操作 |
| fs.write() | 向文件中写入数据,可以指定写入文件的位置和实现数据追加,适用于大文件写入和高并发场景 | 可以指定写入文件的位置和实现数据追加,适用于大文件写入和高并发场景 | 使用比较繁琐,需要多次调用该方法才能完成完整的写入操作 |
| fs.writeSync() | 同步地向文件中写入数据,可以指定写入文件的位置和实现数据追加,适用于大文件写入和高并发场景 | 可以指定写入文件的位置和实现数据追加,适用于大文件写入和高并发场景 | 阻塞IO操作,不适用 |
>[danger] ### fs.writeFile(data, options)
1. `fs.writeFile()`方法用于将数据写入指定的文件中。如果文件不存在,则会创建一个新文件。如果文件已经存在,则它将被覆盖。
>[danger] ##### api
1. `options.signal`是一个可选的参数,用于传递`AbortSignal`对象,用于在读取文件时中止读取操作。`AbortSignal`是一个可以用于终止某些操作的信号对象。当调用`AbortSignal.abort()`函数时,可以向一个或多个正在进行的异步操作发送一个中止信号以取消操作。
2. 虽然 `fs.writeFile()` api 写入文件内容,如果文件不存在则创建文件,如果文件已存在则覆盖文件内容,因为默认flag 为`w`,如果配置例如`a` 即可继续在末尾追加内容
| 参数 | 类型 | 描述 |
| --- | --- | --- |
| file | string `|` Buffer `|` URL `|` integer | 文件名或文件描述符 |
| data | string `|` Buffer `|` TypedArray `|` DataView `|` Object | 要写入文件的数据 |
| options | Object `|` string | 可选的参数对象或字符串 |
| options.encoding | string `|` null | 指定写入文件时使用的字符编码,默认为 'utf8' |
| options.mode | integer | 指定文件的权限,默认为 0o666 |
| options.flag | string | 指定打开文件时的行为,默认为 'w' |
| options.signal | AbortSignal | 允许中止正在进行的写入文件 |
| options.callback | Function | 写入文件完成后的回调函数 |
>[danger] ##### 案例
~~~
const fs = require('fs')
// 写入文件 如果文件存在会覆盖
fs.writeFile('./test.txt', 'hello world', (err) => {
if (err) {
throw err
}
console.log('文件写入成功')
})
// 写入文件使用其他参数,使用wx+ 文件存在会报错
fs.writeFile(
'./test1.txt',
'hello world11111111111111111111',
{ flag: 'wx+' },
(err) => {
if (err) {
console.log(err)
}
console.log('文件写入成功')
}
)
~~~
* 使用signal 组织文件写入
~~~
const fs = require('fs')
const controller = new AbortController()
const signal = controller.signal
const options = { signal }
// 写入文件 如果文件存在会覆盖
fs.writeFile('./test.txt', 'hello world', options, (err) => {
if (err) {
if (err.code === 'ABORT_ERR') {
console.log('文件写入被中断')
} else {
console.log('文件写入失败')
}
} else {
console.log('文件写入成功')
}
})
// 1秒后中断文件写入
setTimeout(() => {
controller.abort()
}, 1000)
~~~
>[danger] ### fsPromises.writeFile(file, data[, options])
1. `fsPromises.writeFile()` 函数用于异步地将数据写入文件中,当我们调用 `fsPromises.writeFile() `方法时,Node.js 会异步地打开一个文件,并将数据写入该文件
2. 如果指定的文件路径不存在,则` fsPromises.writeFile() `方法会自动创建该文件并将数据写入;如果文件已存在,则 `fsPromises.writeFile() `方法会覆盖原有的内容。需要注意的是,由于 `writeFile() `属于一个异步方法,所以在写入文件完成之前,程序会继续执行下去,不会等待` writeFile() `方法的返回结果。如果需要等待 writeFile() 方法执行完毕后再进行其他操作,可以使用 `then()` 或 `await `关键字来等待方法的返回结果。最后,`fsPromises.writeFile() `方法返回一个 `Promise `对象,可以通过 `then() 和 catch() `方法来处理写入文件成功或失败的情况
>[danger] ##### api
| 参数 | 类型 | 描述 |
| --- | --- | --- |
| file | string \| Buffer \| URL \| FileHandle | 要写入的文件名或 FileHandle。 |
| data | string \| Buffer \| TypedArray \| DataView \| AsyncIterable \| Iterable \| Stream | 要写入的数据。可以是字符串、Buffer、TypedArray、DataView、AsyncIterable、Iterable 或 Stream。 |
| options | Object \| string | 可选的参数对象或字符串。如果是字符串,则会被解析为 encoding。可选的属性有: |
| options.encoding | string | null | 要使用的字符编码。默认为 'utf8'。 |
| options.mode | integer | 文件的权限设置,默认为 0o666(即读写所有人)。 |
| options.flag | string | 文件的打开标志,默认为 'w'(如果文件不存在则创建文件;如果文件已存在则截断文件)。 |
| options.signal | AbortSignal | 允许中止正在进行的写入文件操作。 |
>[danger] ##### 案例
~~~
const fsPromises = require('fs').promises
fsPromises
.writeFile('test.txt', 'Hello World', { flag: 'a' })
.then(() => {
console.log('文件写入成功')
})
.catch((err) => {
console.log(err)
})
~~~
* signal终止文件
~~~
const fsPromises = require('fs').promises
const controller = new AbortController()
const signal = controller.signal
const options = { signal }
// 写入文件
function writeFile() {
try {
// fsPromises.writeFile('./test.txt', 'hello world', 'utf8')
fsPromises.writeFile('./test.txt', 'hello world', options)
} catch (error) {
console.log(error)
if (error.name === 'AbortError') {
console.log('写入终止')
}
}
}
writeFile()
// 终止写入
setTimeout(() => {
controller.abort()
}, 1000)
~~~
>[danger] ### fs.writeFileSync(file, data[, options])
1. `fs.writeFileSync(file, data[, options])`是 Node.js 中的文件系统模块(`fs`)提供的同步写文件方法。它用于将指定的数据写入指定的文件。
2. 该方法会将指定数据写入指定文件中,并返回 undefined。如果文件不存在,则该方法会创建文件。如果文件已存在,则该方法会覆盖原有文件内容,并写入新的数据。
3. ,`fs.writeFileSync()`方法是同步的,会阻塞 Node.js 事件循环,直到文件写入完成。因此,在处理大量数据或需要频繁写入文件的情况下,建议使用异步写入方法`fs.writeFile()`,以避免阻塞事件循环。
>[danger] ##### api
| 参数 | 类型 | 描述 | 默认值 |
| --- | --- | --- | --- |
| `file` | `string`\|`Buffer`\|`URL`\|`integer` | 文件名或文件描述符 | |
| `data` | `string`\|`Buffer`\|`TypedArray`\|`DataView`\|`Object` | 要写入文件的数据 | |
| `options` | `Object`\|`string` | 可选参数,可以指定写入的编码格式和文件写入模式等 | |
| `options.encoding` | `string`\|`null` | 指定编码格式 | `'utf8'` |
| `options.mode` | `integer` | 指定文件写入模式 | `0o666` |
| `options.flag` | `string` | 指定文件写入标志 | `'w'` |
>[danger] ##### 案例
~~~
const fs = require('fs')
try {
fs.writeFileSync('test.txt', 'Hello World!')
} catch (err) {
console.log(err)
}
fs.writeFileSync('test.txt', '欢迎', { flag: 'a+' })
~~~
>[danger] ### fsPromises.writeFile(file, data\[, options\])
`fsPromises.writeFile()`是 Node.js 的一个内置函数,它用于将数据写入到指定的文件中。这个函数是通过 Promise 的方式实现的,因此它会返回一个 Promise 对象
>[danger] ##### api
| 参数名 | 类型 | 描述 | 默认值 |
| --- | --- | --- | --- |
| `file` | string \| Buffer \| URL \| FileHandle | 要写入的文件的路径或文件句柄 | 无 |
| `data` | string \| Buffer \| TypedArray \| DataView \| Object \| AsyncIterable \| Iterable \| Stream | 要写入的数据,可以是字符串、Buffer、TypedArray、DataView、Object、AsyncIterable、Iterable 或 Stream 类型 | 无 |
| `options` | Object \| string | 可选参数,一个对象,可以指定写入文件时的选项,比如编码方式、文件模式等。如果是字符串,则表示编码方式,例如`'utf8'`。 | `{ encoding: 'utf8', mode: 0o666, flag: 'w' }` |
| `options.encoding` | string \| null | 指定要使用的编码方式。如果没有指定,则默认使用`'utf8'`编码。如果指定为`null`,则会将数据写入文件中,而不进行编码。 | `'utf8'` |
| `options.mode` | integer | 指定在创建文件时要设置的权限位掩码(文件模式)。默认值为`0o666`,表示允许读写文件。 | `0o666` |
| `options.flag` | string | 指定打开文件时要使用的标志。默认值为`'w'`,表示要以写入模式打开文件。 | `'w'` |
| `options.signal` | AbortSignal | 允许中止正在进行的写入文件操作。 | 无 |
>[danger] ##### 案例
~~~
const fs = require('fs')
const fd = fs.openSync('test.txt', 'w')
fs.promises.writeFile('./a.txt', 'Hello World').then(() => console.log('Done'))
~~~
>[danger] ### fs.appendFile 系列
1. 如果你将`fs.writeFile()`方法的`flag`参数设置为`a`,那么它就会以追加的模式写入文件,与`fs.appendFile()`方法的行为相同。因此,它们可以被认为是等效的,因此直接参考`fs.writeFile()`即可
>[danger] ### fs.write(fd, buffer[, offset[, length[, position]]], callback) / fs.write(fd, string[, position[, encoding]], callback)
1. 使用该方法需要先通过`fs.open()`方法打开文件获取文件描述符。该方法适用于大文件写入和高并发场景,可以指定写入文件的位置和实现数据追加。但是使用比较繁琐,需要多次调用该方法才能完成完整的写入操作。同时,由于需要手动管理文件指针,使用不当可能会导致数据覆盖或丢失,需要谨慎使用。
2. 注意要**手动关闭文件**
| 优点 | 缺点 |
| --- | --- |
| 可以指定写入文件的位置和实现数据追加 | 使用比较繁琐,需要多次调用该方法才能完成完整的写入操作 |
| 能够精准控制写入的缓冲区和字节数,可以提高写入效率和灵活性 | 需要手动管理文件指针,使用不当可能会导致数据覆盖或丢失,需要谨慎使用 |
| 适用于大文件写入和高并发场景 | 不支持 Promise 语法,只能使用回调函数来处理写入完成后的操作 |
>[danger] ##### api
| 参数 | 类型 | 描述 |
| --- | --- | --- |
| fd | integer | 打开的文件描述符 |
| buffer | Buffer / TypedArray / DataView | 写入的缓冲区 |
| offset | integer(可选) | 缓冲区中开始写入的偏移量,默认为 0 |
| length | integer(可选) | 写入的字节数,默认为缓冲区的长度 |
| position | integer(可选) | 文件中开始写入的位置,默认为当前文件指针的位置 |
| callback | Function | 写入操作完成后的回调函数,带有一个错误参数和写入的字节数参数 |
| callback err | Error | 错误对象,如果写入过程中出现错误则会被赋值 |
| callback bytesWritten | integer | 写入的字节数 |
| callback buffer | Buffer / TypedArray / DataView | 与写入操作关联的缓冲区,在回调函数中可以使用 |
* fs.write(fd, string\[, position\[, encoding\]\], callback)
| 参数 | 类型 | 描述 |
| --- | --- | --- |
| fd | integer | 打开的文件描述符 |
| string | string / Buffer | 写入的数据,可以为字符串或 Buffer 对象 |
| position | integer(可选) | 文件中开始写入的位置,默认为当前文件指针的位置 |
| encoding | string(可选) | 字符串的编码格式,默认为 'utf8' |
| callback | Function | 写入操作完成后的回调函数,带有一个错误参数和写入的字节数参数 |
| err | Error | 错误对象,如果写入过程中出现错误则会被赋值 |
>[danger] ##### 案例
~~~
const fs = require('fs')
// 打开文件
fs.open('file.txt', 'a', (err, fd) => {
if (err) throw err
// 写入缓冲区
const buffer = Buffer.from('Hello World!', 'utf-8')
// 写入数据
fs.write(fd, buffer, 0, buffer.length, null, (err, bytesWritten) => {
if (err) throw err
console.log(`${bytesWritten} 字节已被写入文件`)
})
// 关闭文件
fs.close(fd, (err) => {
if (err) throw err
})
})
~~~
* fs.write(fd, string\[, position\[, encoding\]\], callback)
~~~
const fs = require('fs')
const fd = fs.openSync('test.txt', 'w')
fs.writeSync(fd, 'hello world', 0, 'utf-8', (err) => {
if (err) console.log('err')
else console.log('write success')
})
fs.closeSync(fd)
~~~
>[danger] ### fs.writeSync(fd, buffer[, offset[, length[, position]]]) / fs.writeSync(fd, string[, position[, encoding]])
1. 是Node.js中文件系统模块(fs)提供的同步写入文件的API方法。它的作用是将指定的缓冲区(buffer)中的数据写入到文件描述符(fd)所指向的文件中。
2. 返回值是一个整数值,表示实际写入文件的字节数
3. 需要手动关闭
4. 注意事项:
* 使用`fs.writeSync()`方法时会阻塞进程,直到数据被写入到文件中。因此,建议在需要同步写入文件时使用该方法,而不是异步写入文件的方法`fs.write()`。
* 在使用`fs.writeSync()`方法时,要确保文件描述符是有效的,并且缓冲区中的数据不会超出文件的大小限制。
* 在写入数据到文件时,要注意文件的打开方式和文件的访问权限,否则可能会导致写入失败或写入的数据被其他进程覆盖。
>[danger] ##### api
| 参数 | 类型 | 描述 |
| --- | --- | --- |
| `fd` | `integer` | 文件描述符,它是由`fs.open()`方法返回的整数值。 |
| `buffer` | `Buffer`|`TypedArray`|`DataView`|`string`|`Object` | 要写入文件的缓冲区,可以是Buffer对象或Uint8Array类型。 |
| `offset` | `integer`(可选) | 缓冲区中的偏移量,指定从缓冲区的哪个位置开始写入数据到文件。默认值为0。 |
| `length` | `integer`(可选) | 要写入的字节数,指定从缓冲区中写入多少字节的数据到文件。默认值为缓冲区的长度。 |
| `position` | `integer`(可选) | 指定从文件的哪个位置开始写入数据,如果省略该参数,则从文件的当前位置开始写入数据。 |
* fs.writeSync(fd, string\[, position\[, encoding\]\]
| 参数 | 类型 | 描述 |
| --- | --- | --- |
| fd | integer | 打开的文件描述符 |
| string | string / Buffer /TypedArray/DataView/ Object | 写入的数据,可以为字符串、Buffer 对象、TypedArray、DataView 或 Object 对象 |
| position | integer(可选) | 文件中开始写入的位置,默认为当前文件指针的位置 |
| encoding | string(可选) | 字符串的编码格式 |
| 返回值 | integer | 写入的字节数 |
>[danger] ##### 案例
~~~
const fs = require('fs')
const fd = fs.openSync('test.txt', 'w')
try {
const buf = Buffer.from('Hello World', 'utf8')
fs.writeSync(fd, buf, 0, buf.length, 0)
fs.closeSync(fd)
} catch (e) {
console.log(e)
}
~~~
* fs.writeSync(fd, string[, position[, encoding]]
~~~
const fs = require('fs')
const fd = fs.openSync('test.txt', 'w')
try {
fs.writeSync(fd, 'Hello World', 0, 'utf-8')
fs.closeSync(fd)
} catch (e) {
console.log(e)
}
~~~
>[danger] ### fs.createWriteStream(path[, options])
1. `fs.createWriteStream()`是 Node.js 文件系统模块中的一个函数,用于创建一个可写流,将数据写入到指定的文件中。它的参数包括路径和选项,其中路径是需要写入的文件的完整路径,选项包括各种可选参数,如编码方式、写入模式、缓冲区大小等等。`fs.createWriteStream()`返回一个可写流对象,你可以使用它的`write()`方法来将数据写入文件中,使用`end()`方法来结束写入操作。在写入完成后,可写流对象会自动关闭。
>[danger] ##### api
| 参数 | 类型 | 描述 | 默认值 |
| --- | --- | --- | --- |
| path | string|Buffer|URL | 文件的路径 | 无 |
| options | string|Object | 可选的配置项 | 无 |
| options.flags | string | 文件打开的标志,参考[文件系统 flags](https://nodejs.org/docs/latest-v16.x/api/fs.html#fs_file_system_flags) | `'w'` |
| options.encoding | string | 写入的编码方式 | `'utf8'` |
| options.fd | integer|FileHandle | 文件描述符或文件句柄 | `null` |
| options.mode | integer | 创建文件的权限 | `0o666` |
| options.autoClose | boolean | 是否自动关闭文件 | `true` |
| options.emitClose | boolean | 是否在关闭文件时发送`close`事件 | `true` |
| options.start | integer | 写入文件的起始位置 | `0` |
| options.fs | Object|null | 文件系统模块 | `null` |
>[danger] ##### 案例
~~~
const fs = require('fs');
const writeStream = fs.createWriteStream('output.txt', {
flags: 'a', // 追加模式
encoding: 'utf8',
mode: 0o666,
autoClose: true,
start: 0,
highWaterMark: 64 * 1024 // 64KB 缓冲区
});
writeStream.write('Hello, world!', 'utf8', () => {
console.log('数据写入成功!');
});
writeStream.end(() => {
console.log('文件写入完成!');
});
~~~
- 基础
- 什么是Node.js
- 理解 I/O 模型
- 理解node 中 I/O
- 对比node 和java 使用场景
- node 模块管理
- 内置模块 -- buffer
- 内置模块 -- fs
- fs -- 文件描述符
- fs -- 打开文件 api
- fs -- 文件读取 api
- fs -- 文件写入 api
- fs -- 创建目录 api
- fs -- 读取文件目录结构 api
- fs -- 文件状态(信息) api
- fs -- 删除文件/目录 api
- fs -- 重命名 api
- fs -- 复制文件 api
- 内置模块 -- events
- 内置模块 -- stream
- 可读流 -- Readable
- 可写流 -- Writable
- Duplex
- Transform
- 内置模块 -- http
- http -- 从客户端发起
- http -- 从服务端发起
- 内置模块 -- url
- 网络开发