Nodejs의 쓰기 가능한 스트림 쓰기 및 구현 방법에 대한 간략한 토론
이 글에서는 Nodejs의 쓰기 가능한 스트림 쓰기를 이해하고 Node의 쓰기 가능한 스트림 쓰기 구현을 소개합니다. 도움이 필요한 친구들이 모두 참고할 수 있기를 바랍니다.
【추천 학습: "nodejs tutorial"】
Writable stream-Writable
fs.createWriteStream 호출 예제
- 처음으로 읽은 데이터는 실제로 대상에 기록됩니다. file
- 남은 시간 동안 읽은 데이터는 읽은 데이터가 highWaterMark를 초과하는지 여부에 따라 다릅니다. 그렇다면 버퍼 영역에 저장되고 대상 파일에 기록되기를 기다립니다. 링크 된 목록 생성 대기열을위한 링크 된 목록 및 queue
- RRSINITIALIZE 인스턴스 기본 데이터 생성자 ()
const fs = require("fs"); const path = require("path"); const bPath = path.join(__dirname, "b.txt"); let ws = fs.createWriteStream(bPath, { flags: "w", encoding: "utf-8", autoClose: true, start: 0, highWaterMark: 3, }); ws.on("open", function (fd) { console.log("open", fd); }); ws.on("close", function () { console.log("close"); }); //string 或者buffer,ws.write 还有一个boolea的返回值 ws.write("1"); //flag 表示 当前要写的值是直接是否直接写入文件,不能超出了单次最大写入值highWaterMark let flag = ws.write("1"); console.log({ flag });//true flag = ws.write("1"); console.log({ flag });//false flag = ws.write("1"); console.log({ flag });//false flag = ws.write("14444444"); console.log({ flag });//false ws.end(); //write+close,没有调用 end 是不会调用 触发close的,看到这里的小伙伴可以尝试注释end() 看看close的console是否有打印
로그인 후 복사
const EventEmitter = require("events"); const fs = require("fs"); class WriteStream extends EventEmitter {} module.exports = WriteStream;
세 개의 6이 차지하는 위치는 각각 다음과 같습니다. 파일이 속한 사용자의 권한 파일이 속한 사용자 그룹의 권한 . 해당 권한은 다른 사용자의 권한을 나타냅니다.
권한은 r-읽기 가능(값 4에 해당), w--쓰기 가능(값 2에 해당), x--실행 가능(값에 해당) 값이 1, 예를 들어 폴더 아래에 .exe와 같은 표시가 있어 클릭이 바로 실행될 수 있음을 나타냅니다.) 따라서 기본적으로 해당 파일에 대한 세 사용자 그룹의 작업 권한은 읽기 및 쓰기가 가능합니다
open()
emit 인스턴스 open 메소드를 다시 호출하고 fs.open의 반환값 fd가 매개변수로 전달됩니다Call fs.open()
// 用链表 生成队列 对 文件缓存区的读取 进行优化
const Queue = require("./queue");
로그인 후 복사
write() // 用链表 生成队列 对 文件缓存区的读取 进行优化 const Queue = require("./queue");
- 기록해야 하는 인스턴스에서 전달한 파일을 변환합니다. 데이터 형식은 버퍼입니다
- 기록된 데이터의 길이가 highWaterMark보다 큰지 확인합니다. 예상에 도달하면 파일에서 읽은 데이터는 다음과 같습니다. 캐시에 저장되고 대상 파일에 직접 쓰지 않습니다(파일을 처음 읽는지 여부 제외)
- 파일인지 판단합니다. 첫 번째 읽기는 직접 기록되고 _write(구현 예정)라고 불립니다.현재 캐시 큐 끝에서 읽은 제안 데이터가 대상 파일에 기록되기를 기다리고 있습니다
- clearBuffer()는 캐시 큐는 순차적으로
constructor(path, options = {}) { super(); this.path = path; this.flags = options.flags || "w"; this.encoding = options.encoding || "utf8"; this.mode = options.mode || 0o666; //默认8进制 ,6 6 6 三组分别的权限是 可读可写 this.autoClose = options.start || 0; this.highWaterMark = options.highWaterMark || 16 * 1024; //默认一次读取16个字节的数据 this.len = 0; //用于维持有多少数据还没有被写入文件中 //是否根据等待当前读取的最大文数据 排空后再写入 this.needDrain = false; // // 缓存队列 用于存放 非第一次的文件读取 到的数据,因为第一次读取 直接塞入目标文件中 // 除第一次 的文件读取数据的都存放再缓存中 // this.cache = []; // 队列做缓存 this.cache = new Queue(); // 标记是否是第一次写入目标文件的标识 this.writing = false; this.start = options.start || 0; this.offset = this.start; //偏移量 this.open(); }
로그인 후 복사
- 기록된 데이터의 길이가 highWaterMark보다 큰지 확인합니다. 예상에 도달하면 파일에서 읽은 데이터는 다음과 같습니다. 캐시에 저장되고 대상 파일에 직접 쓰지 않습니다(파일을 처음 읽는지 여부 제외)
this.cache.poll()은 헤더 데이터를 순차적으로 가져와서 실행합니다._write 대상 파일을 입력합니다
데이터가 캐시 큐에서 폴링된 경우 존재하지 않으면 첫 번째 쓰기임을 의미합니다. ||캐시 큐가 지워졌습니다. this.writing = false; 다음에 읽은 파일은 대상 파일에 직접 쓸 수 있습니다- this.needDrain이 다시 기대치를 충족하면 대상 파일에 직접 쓰지 않고 파일을 읽고 데이터가 캐시에 저장됩니다
open() { fs.open(this.path, this.flags, this.mode, (err, fd) => { this.fd = fd; this.emit("open", fd); }); }
로그인 후 복사
fs.open()은 비동기식입니다. 성공적으로 읽은 후 fd는 number 유형이 됩니다.
- fd 유형에 따라 공개를 구독할지 여부를 결정하고 fd 유형이 나올 때까지 직접 콜백하세요. is number)
- fd 유형 숫자의 경우: fs.write 호출, 현재 청크 쓰기,
write(chunk, encoding = this.encoding, cb = () => {}) { // 将数据全部转换成buffer chunk = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk); this.len += chunk.length; // console.log({chunk},this.len ) let returnValue = this.len < this.highWaterMark; //当数据写入后,需要在手动的将this.len-- this.needDrain = !returnValue; //如果达到预期 后 的文件读取 到数据存放再缓存里 不直接写入目标文件 //清空缓存 对用户传入的回调 进行二次包装 let userCb = cb; cb = () => { userCb(); //清空buffer this.clearBuffer();//马上实现 }; //此时需要判断 是否是第一次读取,第一次读取 直接写入调用 _write if (!this.writing) { // 第一次||缓存队列已清空完毕 this.writing = true; // console.log("first write"); this._write(chunk, encoding, cb);//马上实现 } else { //缓存队列尾部offer 当前读取到的数据等待写入目标文件 this.cache.offer({ chunk, encoding, cb, }); } return returnValue; }
로그인 후 복사- 사용자 정의 Writable
clearBuffer() { //写入成功后 调用 clearBuffer--》写入缓存第一个,第一个完成后,再继续 第二个 let data = this.cache.poll(); // console.log('this.cache',this.cache) if (data) { //有值 写入文件 this._write(data.chunk, data.encoding, data.cb); } else { this.writing = false; if (this.needDrain) { // 如果是缓存,触发drain this.emit("drain"); } } }
로그인 후 복사
- 우리가 예상한 값이 대상 파일에 올바르게 기록되었는지 확인하세요
- 더 많은 프로그래밍 관련 지식을 원하시면 방문:
! !
위 내용은 Nodejs의 쓰기 가능한 스트림 쓰기 및 구현 방법에 대한 간략한 토론의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Node.js와 Tomcat의 주요 차이점은 다음과 같습니다. 런타임: Node.js는 JavaScript 런타임을 기반으로 하는 반면 Tomcat은 Java Servlet 컨테이너입니다. I/O 모델: Node.js는 비동기식 비차단 모델을 사용하는 반면 Tomcat은 동기식 차단 모델을 사용합니다. 동시성 처리: Node.js는 이벤트 루프를 통해 동시성을 처리하는 반면 Tomcat은 스레드 풀을 사용합니다. 애플리케이션 시나리오: Node.js는 실시간, 데이터 집약적, 동시성 애플리케이션에 적합하고 Tomcat은 기존 Java 웹 애플리케이션에 적합합니다.

Node.js는 서버측 JavaScript 런타임인 반면, Vue.js는 대화형 사용자 인터페이스를 생성하기 위한 클라이언트측 JavaScript 프레임워크입니다. Node.js는 백엔드 서비스 API 개발, 데이터 처리 등 서버 측 개발에 사용되고, Vue.js는 단일 페이지 애플리케이션, 반응형 사용자 인터페이스 등 클라이언트 측 개발에 사용됩니다.

Node.js는 고성능, 확장성, 크로스 플랫폼 지원, 풍부한 생태계, 개발 용이성 등의 기능을 제공하므로 백엔드 프레임워크로 사용할 수 있습니다.

MySQL 데이터베이스에 연결하려면 다음 단계를 따라야 합니다. mysql2 드라이버를 설치합니다. mysql2.createConnection()을 사용하여 호스트 주소, 포트, 사용자 이름, 비밀번호 및 데이터베이스 이름이 포함된 연결 개체를 만듭니다. 쿼리를 수행하려면 Connection.query()를 사용하세요. 마지막으로 Connection.end()를 사용하여 연결을 종료합니다.

Node.js에는 다음과 같은 전역 변수가 존재합니다. 전역 개체: 전역 핵심 모듈: 프로세스, 콘솔, 필수 런타임 환경 변수: __dirname, __filename, __line, __column 상수: undefine, null, NaN, Infinity, -Infinity

Node.js 설치 디렉터리에는 npm과 npm.cmd라는 두 가지 npm 관련 파일이 있습니다. 차이점은 다음과 같습니다. 확장자가 다릅니다. npm은 실행 파일이고 npm.cmd는 명령 창 바로 가기입니다. Windows 사용자: npm.cmd는 명령 프롬프트에서 사용할 수 있으며, npm은 명령줄에서만 실행할 수 있습니다. 호환성: npm.cmd는 Windows 시스템에만 해당되며 npm은 크로스 플랫폼에서 사용할 수 있습니다. 사용 권장사항: Windows 사용자는 npm.cmd를 사용하고, 기타 운영 체제는 npm을 사용합니다.

Node.js와 Java의 주요 차이점은 디자인과 기능입니다. 이벤트 중심 대 스레드 중심: Node.js는 이벤트 중심이고 Java는 스레드 중심입니다. 단일 스레드 대 다중 스레드: Node.js는 단일 스레드 이벤트 루프를 사용하고 Java는 다중 스레드 아키텍처를 사용합니다. 런타임 환경: Node.js는 V8 JavaScript 엔진에서 실행되는 반면 Java는 JVM에서 실행됩니다. 구문: Node.js는 JavaScript 구문을 사용하고 Java는 Java 구문을 사용합니다. 목적: Node.js는 I/O 집약적인 작업에 적합한 반면, Java는 대규모 엔터프라이즈 애플리케이션에 적합합니다.

예, Node.js는 백엔드 개발 언어입니다. 서버 측 비즈니스 로직 처리, 데이터베이스 연결 관리, API 제공 등 백엔드 개발에 사용됩니다.
