>웹 프론트엔드 >JS 튜토리얼 >Node의 스트림에 대해 이야기하는 기사

Node의 스트림에 대해 이야기하는 기사

青灯夜游
青灯夜游앞으로
2023-02-27 19:17:441582검색

플로우란 무엇인가요? 흐름을 이해하는 방법? 다음 기사는 Nodejs의 스트림에 대한 심층적인 이해를 제공할 것입니다. 도움이 되기를 바랍니다.

Node의 스트림에 대해 이야기하는 기사

stream은 스트림으로, 물의 흐름처럼 존재하는 일련의 바이트로 이해될 수 있습니다. 공식 문서의 설명에 따르면:

스트림은 Node.js에서 스트리밍 데이터 작업을 위한 추상 인터페이스입니다.

스트림은 Node.js에서 스트림 데이터를 처리하기 위한 추상 인터페이스입니다. 연속 바이트 인터페이스의 추상화입니다. 스트림에는 기본적으로 4가지 유형이 있으며, 이 글에서는 그 중 읽기 가능한 스트림과 쓰기 가능한 스트림 두 가지를 주로 소개합니다.

Readable

fs.createReadStream()을 통해 읽기 가능한 스트림 readStream을 생성할 수 있습니다. 첫 번째 매개변수는 읽을 파일 경로입니다. 예를 들어 기존 파일 test.txt의 내용은 다음과 같습니다. fs.createReadStream() 创建一个可读流 readableStream,第 1 个参数可以是要读取的文件路径,比如现有文件 test.txt 内容为:

hello juejin

第 2 个参数(可选)可以传入一个选项对象,用来控制读取数据的起止位置等: 【相关教程推荐:nodejs视频教程

const fs = require('fs')

const readableStream = fs.createReadStream('./test.txt', {
  start: 6,
  end: 11
})

注意,读取的数据是包括了 startend 的。 在之前介绍 events 模块时说过,所有的流都是 EventEmitter 的实例。所以获取数据是通过监听 'data' 事件:

readableStream.on('data', data => {
  console.log(data)
  console.log(data.toString())
})

打印结果如下,默认是 Buffer 对象,可以通过 toString() 方法转为字符串:

Node의 스트림에 대해 이야기하는 기사

注意,读取数据时一次最多读取 64 * 1024 字节,如果想改变该数值,可以通过 highWaterMark 选项更改。另外还可以使用 pause() 进行暂停操作,使用 resume() 继续读取:

const readableStream = fs.createReadStream('./test.txt', {
  start: 6,
  end: 11,
  highWaterMark: 2 // 默认为 64 * 1024
})

readableStream.on('data', data => {
  console.log(data)
  console.log(data.toString())
  readableStream.pause() // 暂停读取
  setTimeout(() => {
    readableStream.resume() // 恢复读取
  }, 2000)
})

执行结果如下:

Node의 스트림에 대해 이야기하는 기사

除了 'data' 事件,可读流还有其它一些事件,比如监听文件被打开的 'open'(回调会被传入 fd 参数),监听文件读取到 end(默认为读取到最后)的 'end',监听文件关闭的 'close'(文件读取完会自动关闭):

readableStream.on('data', data => console.log(data))
readableStream.on('open', fd => console.log(`${fd}文件打开了`))
readableStream.on('end', () => console.log('文件读取到 end 位置了'))
readableStream.on('close', () => console.log('文件已关闭'))

打印结果如下:

Node의 스트림에 대해 이야기하는 기사

可写的(Writable)

使用 fs.createWriteStream() 可以创建可写流,第 1 个参数传入要写入的文件,第 2 个同样是用于配置的可选参数,这里我们将 flags 由表示覆盖写入的 'w' 改为 'a',即追加写入(如果还指定了写入的起始位置 start,则为了兼容 windows 系统, flags 应该写成 'r+'):

const writableStream = fs.createWriteStream('test.txt', {
  flags: 'a'
})

writableStream.write('养成', err => console.log(`错误信息:${err}`)) // 错误信息:undefined
writableStream.write('写作的')
writableStream.end('好习惯')

写入数据是通过 write 方法,上方代码执行的结果就是在原本的 "hello juejin" 后添加上了 "养成写作的好习惯"。最后一次写入可以使用 end 方法,这样就能监听到可写流的 'close' 事件了:

writableStream.on('close', () => {
  console.log('关闭')
})

否则,可写流需要手动 writableStream.close() 关闭才能监听到 'close' 事件。如果写入成功,则作为 write()/end() 的第 2 个参数传入的回调的 err 就为 undefined

可读流还有另外一些事件,比如文件打开时的 'open' 事件,当 close()end() 被调用后文件写入完成的 'finish' 事件。

可读流与可写流的连接

可读流与可写流可以通过 pipe

const readableStream = fs.createReadStream('./test.txt')
const writableStream = fs.createWriteStream('./copy.txt')

readableStream.pipe(writableStream)

두 번째 매개변수(선택 사항)는 데이터 읽기의 시작 및 끝 위치 등을 제어하기 위해 옵션 개체에 전달될 수 있습니다. [관련 튜토리얼 권장 사항: nodejs 동영상 튜토리얼

]

rrreee

읽은 데이터에는 start code>가 포함됩니다. 그리고 <code>끝. 제가 events 모듈을 소개할 때, 스트림은 EventEmitter의 인스턴스입니다. 따라서 'data' 이벤트를 청취하여 데이터를 얻습니다. rrreee

인쇄 결과는 다음과 같습니다. 기본값은 Buffer🎜 개체는 toString() 메서드를 통해 문자열로 변환할 수 있습니다: 🎜🎜Node의 스트림에 대해 이야기하는 기사🎜🎜데이터를 읽을 때 주의하세요. 한 번에 최대 64 * 1024 단어를 읽을 수 있습니다. 섹션, 이 값을 변경하려면 highWaterMark 옵션을 통해 변경할 수 있습니다. 또한 pause()를 사용하여 작업을 일시 중지하고 resume()을 사용하여 계속 읽을 수도 있습니다. 🎜rrreee🎜실행 결과는 다음과 같습니다. 🎜🎜 Node의 스트림에 대해 이야기하는 기사🎜🎜 'data' 파일이 열리는 것을 모니터링하는 'open'과 같은 이벤트, 읽을 수 있는 스트림 및 기타 이벤트(콜백은 fd🎜 매개변수), end까지 읽은 파일을 모니터링합니다(기본값은 끝까지 읽으려면) >'end', 파일 닫기를 모니터링하는 'close'(읽은 후 파일이 자동으로 닫힙니다): 🎜rrreee🎜인쇄 결과는 다음과 같습니다. 🎜🎜Node의 스트림에 대해 이야기하는 기사🎜🎜🎜 쓰기 가능(Writable)🎜🎜🎜fs.createWriteStream()을 사용하면 쓰기 가능한 스트림을 생성할 수 있습니다. 두 번째 매개 변수도 여기서 구성을 위한 선택적 매개 변수입니다. 플래그'w'에서 변경되어 'a'에 덮어쓰기 쓰기, 즉 쓰기 추가를 나타냅니다(쓰기 시작 위치가 start도 지정됩니다. Windows 시스템과 호환하려면 플래그'r+'로 작성해야 합니다. 🎜rrreee🎜데이터 쓰기 write 메소드를 통해, 위 코드를 실행한 결과 원래의 "hello juejin" 뒤에 "Develop a good 습관 of writing"이 추가됩니다. 마지막 쓰기에서는 end 메서드를 사용할 수 있으므로 쓰기 가능한 스트림의 'close' 이벤트를 모니터링할 수 있습니다. 🎜rrreee🎜 그렇지 않으면 쓰기 가능한 스트림을 수동으로 관리해야 합니다. 'close' 이벤트를 수신하려면 WritableStream.close()를 닫아야 합니다. 쓰기가 성공하면 write()/end()의 두 번째 매개변수로 전달된 콜백의 err정의되지 않음이 됩니다. 🎜🎜읽기 가능한 스트림에는 파일이 열릴 때, close() 또는 end()일 때 'open' 이벤트와 같은 다른 이벤트도 있습니다. > 파일 쓰기가 완료된 후 'finish' 이벤트에 의해 호출됩니다. 🎜🎜🎜읽기 가능한 스트림과 쓰기 가능한 스트림의 연결🎜🎜🎜읽기 가능한 스트림과 쓰기 가능한 스트림은 pipe 메서드를 통해 연결하여 파일을 복사할 수 있습니다. 🎜rrreee🎜이 방법으로 ./의 텍스트를 사용할 수 있습니다. test.txt가 ./copy.txt로 복사됩니다. 🎜🎜노드 관련 지식을 더 보려면 🎜nodejs 튜토리얼🎜을 방문하세요! 🎜

위 내용은 Node의 스트림에 대해 이야기하는 기사의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 juejin.cn에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제