:流式讀取與 Buffer 操作快速上手指南)
scriptc 文件處理實戰(zhàn)流式讀取與 Buffer 操作快速上手指南【免費下載鏈接】scriptcTypeScript-to-Native Compiler項目地址: https://gitcode.com/GitHub_Trending/sc/scriptcscriptc 是一個TypeScript 到原生的編譯器它能把 TypeScript/JavaScript 直接編譯成可執(zhí)行的原生二進制文件產(chǎn)物不需要 Node 運行時。用它寫文件處理工具你既能用上 Node 生態(tài)的stream、Buffer、fs全套 API又能得到一個零依賴、秒啟動的獨立程序——這正是本文要解決的如何用 scriptc 構建文件處理工具掌握流式讀取與 Buffer 二進制操作。為什么用 scriptc 寫文件處理工具傳統(tǒng)做法寫一個 Node 腳本分發(fā)給別人時還得要求對方裝 Node.js。scriptc 的做法$ npm install -g scriptc $ scriptc build my-tool.ts -o my-tool $ ./my-tool # 獨立可執(zhí)行文件無需 Node關鍵特性產(chǎn)物是原生二進制啟動快、體積小stream/fs/crypto等受支持的 Node API 會直接編譯進原生運行時靜態(tài)覆蓋率檢查scriptc coverage xxx.ts能告訴你哪些代碼 100% 靜態(tài)編譯、哪些走動態(tài)回退npm 包也能嵌入加--dynamic即可把第三方 JS 庫打進可執(zhí)行文件。原生運行時中流與字節(jié)操作分別由 scr_stream.c 和 scr_bytes.c 等 C 源碼實現(xiàn)——這是 scriptc 文件處理能力的底座。流式讀取pipe 三連擊處理大文件時永遠不要一次性讀進內存而是用流stream逐塊處理。scriptc 完整支持node:stream的Readable/PassThrough/Writable核心就是三件事push 數(shù)據(jù)、pipe 串聯(lián)、end 收尾。項目自帶的回歸語料 1685-stream-readable-basics.ts 演示了最典型的 Readable 用法import { Readable } from node:stream; const r new Readable({ read() {} }); r.on(data, (chunk: Buffer) console.log(data:, chunk.toString(), chunk.length)); r.on(end, () console.log(end)); r.push(hello ); // 向流中推入數(shù)據(jù)塊 r.push(Buffer.from(world)); r.push(null); // push(null) 表示流結束而 1692-stream-pipe.ts 展示了pipe的經(jīng)典管道形態(tài)——src.pipe(mid).pipe(sink)數(shù)據(jù)自動從源頭流向終點中途還能用PassThrough做轉手src.pipe(mid).pipe(sink); // 數(shù)據(jù)沿管道自動流動 src.push(first); src.push(null); // 源頭結束會向下游傳播別忘了背壓Backpressure當消費端處理慢時流會自動暫停生產(chǎn)端等待drain事件保證每個字節(jié)都按序到達。語料 1693-stream-pipe-backpressure.ts 用一個極小的highWaterMark: 3制造了慢速目的地驗證背壓機制正確工作const dst new Writable({ highWaterMark: 3, write(chunk, enc, callback) { // 慢處理比如寫磁盤延遲回調即可觸發(fā)背壓 setTimeout(() callback(), 1); }, }); src.pipe(dst);寫文件工具時這個模式可以直接套用可讀端讀文件 → 管道 → 可寫端寫磁盤內存占用恒定處理 10GB 文件也沒壓力。Buffer 操作二進制世界的瑞士軍刀文件底層都是字節(jié)Buffer是操作字節(jié)的標配。以下技巧全部在 scriptc 中可用且行為與 Node 完全一致測試語料逐字節(jié)對比過輸出。1?? 編碼往返utf8 / hex / base641402-buffer-encodings.ts 覆蓋了編碼往返的邊界情況const b Buffer.from(héllo , utf8); b.toString(hex); // 轉十六進制 b.toString(base64); // 轉 base64 Buffer.from(b.toString(base64), base64); // 無損還原一個實用的細節(jié)非法 UTF-8 字節(jié)序列會按最大子部分替換為 UFFFD替換字符與 Node 行為精確一致——解析不可信的二進制文件時這個細節(jié)很重要。2?? 二進制讀寫數(shù)值與偏移處理文件格式圖片、協(xié)議包、序列化數(shù)據(jù)離不開按整數(shù)讀寫const w Buffer.alloc(8); w.writeUInt32BE(3735928559, 1); // 從偏移 1 寫 4 字節(jié)大端整數(shù) w.readUInt32BE(1); // 再讀回來注意越界會拋RangeError見 1402-buffer-encodings.ts 中的三段 try/catch寫協(xié)議解析器時記得做邊界防御。3?? 搜索與比較equals / indexOf / fill1663-buffer-compare-search-fill.ts 是 Buffer 搜索接口的完整演示const h Buffer.from(abcabcabc); h.indexOf(bc); // 字符串搜索 h.indexOf(98); // 按字節(jié)值搜索98 b h.includes(Buffer.from(ca)); // 用 Buffer 做針 h.lastIndexOf(bc, 4); // 反向搜索 Buffer.alloc(5).fill(ab).toString(); // 填充重復模式 a.equals(b); // 逐字節(jié)比較 a.compare(b, 1, 3, 0, 2); // 區(qū)間比較返回 -1/0/1indexOf還支持傳入hex、base64、utf16le編碼的針甚至負數(shù)偏移——在二進制文件里定位魔數(shù)magic number非常順手。組合實戰(zhàn)fd Buffer 讀取真實文件把兩塊拼圖合起來就是最硬核的文件處理姿勢fs.readSync把字節(jié)直接讀進自己分配的 Buffer。語料 1640-fd-read-decode.ts 展示了完整流程import * as fs from node:fs; import * as os from node:os; import * as path from node:path; const scratch path.join(os.tmpdir(), scr-${process.pid}.txt); fs.writeFileSync(scratch, 0123456789abcdefghijklmnopqrstuvwxyz.repeat(6)); const buffer Buffer.allocUnsafe(64); // 復用緩沖區(qū) const fd fs.openSync(scratch, r); const bytesRead fs.readSync(fd, buffer, 0, 64); fs.closeSync(fd);這段代碼還有兩個進階點值得學習position參數(shù)fs.readSync(fd, buf, 0, 5, 10)從字節(jié) 10 開始讀且不移動文件指針傳null或-1則從當前位置讀并推進——做隨機訪問seek-like 讀取時非常有用范圍解碼buffer.toString(utf8, 6, 999)對越界偏移做了與 Node 一致的鉗制clamp不會崩潰。編譯運行它$ scriptc build tool.ts -o tool $ ./tool收尾用 coverage 驗證你的工具寫完文件處理工具后跑一下靜態(tài)覆蓋率檢查確認沒有意外落入動態(tài)回退的代碼$ scriptc coverage tool.ts statements analyzed 42 compile statically 42 (100%)更多 API 邊界行為可以參考 coverage-fixtures 目錄以及語料庫 tests/corpus 中 1600 編號的測試場景——它們本身就是最好的Node API 行為手冊??偨Y能力核心 API參考語料流式讀取Readable/pipe/push(null)1685管道串聯(lián)src.pipe(mid).pipe(sink)1692背壓控制highWaterMark 延遲callback1693編碼往返from/toStringutf8/hex/base641402二進制搜索indexOf/equals/fill1663隨機讀取readSyncBuffer.allocUnsafe1640一句話記住流管數(shù)據(jù)流動Buffer 管字節(jié)細節(jié)scriptc 負責把兩者打包成一個零依賴的原生文件處理工具 ?!久赓M下載鏈接】scriptcTypeScript-to-Native Compiler項目地址: https://gitcode.com/GitHub_Trending/sc/scriptc創(chuàng)作聲明:本文部分內容由AI輔助生成(AIGC),僅供參考