NodeJS的fs模塊的readFile和createReadStream區別以及常見方法

Node.js 本身沒有像 Java 那樣嚴格區分字符流和字節流,區別主要靠編碼(encoding)來控制數據是以 Buffer(二進制字節)形式還是字符串(字符)形式處理。


詳細解釋:

方面JavaNode.js
字節流InputStream / OutputStream默認情況下的 Readable / Writable 流,數據是 Buffer(二進制)
字符流Reader / Writer流上設置 encoding,數據自動轉換成字符串(UTF-8、ASCII 等)
編碼處理字節流和字符流類分開,編碼需自己控制Buffer 是二進制字節,設置 encoding 自動轉換成字符
示例FileInputStream vs FileReaderfs.createReadStream + encoding 參數
API差異不同基類,區別明顯同一套流 API,參數控制返回類型


舉個 Node.js 代碼例子說明:

const fs = require('fs');// 字節流(默認,讀取到 Buffer)
const stream1 = fs.createReadStream('file.txt');
stream1.on('data', chunk => {console.log(Buffer.isBuffer(chunk)); // true,收到的是 Buffer(二進制)
});// 字符流(設置編碼,讀取到字符串)
const stream2 = fs.createReadStream('file.txt', { encoding: 'utf8' });
stream2.on('data', chunk => {console.log(typeof chunk); // string,收到的是字符串
});

總結

  • Node.js 流是統一的“字節流”,數據默認是 Buffer 類型的二進制。

  • 通過給流設置 encoding,Node.js 會自動將字節流轉換成字符串,達到類似 Java 字符流的效果。

  • Java 是在類結構上區分字符流和字節流;Node.js 是靠參數和 Buffer 來決定處理方式。

如果你做文件操作,想“像用字符流一樣”處理文本,就用帶編碼的流;如果要處理二進制數據,就用默認的 Buffer 流。

你想了解 Node.js 里跟文件讀取(以及文件操作)相關的常見函數,尤其是跟“讀取(read)”、“讀文件(readFile)”、“創建(create)”、“流(stream)”有關的。順便幫你補充一些常用但你沒說的相關函數。

我幫你把 Node.js 文件系統(fs模塊)相關常用方法做個全面的梳理和舉例。


Node.js 文件讀寫相關函數大全

1. fs.readFile()fs.readFileSync()

  • 作用:一次性讀取整個文件內容(異步和同步版本)

  • 示例:

const fs = require('fs');// 異步讀文件
fs.readFile('example.txt', 'utf8', (err, data) => {if (err) throw err;console.log('異步讀文件內容:', data);
});// 同步讀文件
const content = fs.readFileSync('example.txt', 'utf8');
console.log('同步讀文件內容:', content);

2. fs.read()

  • 作用:讀取文件的部分內容(基于文件描述符,低級 API)

  • 需要先打開文件,得到文件描述符(fd)

  • 示例:

const fs = require('fs');fs.open('example.txt', 'r', (err, fd) => {if (err) throw err;const buffer = Buffer.alloc(10); // 讀取10字節fs.read(fd, buffer, 0, 10, 0, (err, bytesRead, buf) => {if (err) throw err;console.log('讀取字節數:', bytesRead);console.log('讀取內容:', buf.toString('utf8', 0, bytesRead));fs.close(fd, (err) => {if (err) throw err;});});
});

3. fs.createReadStream()

  • 作用:創建一個可讀流,適合大文件或流式處理

  • 示例:

const fs = require('fs');const readStream = fs.createReadStream('example.txt', { encoding: 'utf8', highWaterMark: 16 * 1024 });readStream.on('data', (chunk) => {console.log('讀取到數據塊:', chunk);
});readStream.on('end', () => {console.log('讀取完畢');
});readStream.on('error', (err) => {console.error('讀取錯誤:', err);
});

4. fs.open() / fs.close()

  • 作用:打開文件,返回文件描述符(fd),用于更底層操作;操作結束后關閉文件

  • 示例:

fs.open('example.txt', 'r', (err, fd) => {if (err) throw err;console.log('文件描述符:', fd);fs.close(fd, (err) => {if (err) throw err;console.log('文件已關閉');});
});

5. fs.readSync()

  • 同步版本的 fs.read(),基于 fd 讀文件部分內容

  • 示例:

const fd = fs.openSync('example.txt', 'r');
const buffer = Buffer.alloc(10);
const bytesRead = fs.readSync(fd, buffer, 0, 10, 0);
console.log(buffer.toString('utf8', 0, bytesRead));
fs.closeSync(fd);

6. fs.readv() / fs.readvSync()(Node.js 12+)

  • 作用:一次讀取多個 buffer(分散讀)

  • 相對較少用,進階用法


7. 其它相關的文件讀取與創建函數

函數說明同步/異步
fs.writeFile() / fs.writeFileSync()寫文件(覆蓋寫)異步/同步
fs.appendFile() / fs.appendFileSync()追加寫文件異步/同步
fs.createWriteStream()創建寫流適合大文件或流式寫入
fs.exists() / fs.existsSync()判斷文件是否存在(不推薦,建議用 fs.stat異步/同步
fs.stat() / fs.statSync()獲取文件信息(大小、時間等)異步/同步
fs.readdir() / fs.readdirSync()讀取目錄下文件列表異步/同步


8. 結合 stream 讀取文件示例

const fs = require('fs');
const { pipeline } = require('stream');const readStream = fs.createReadStream('example.txt', { encoding: 'utf8' });
readStream.on('data', (chunk) => {console.log('讀取塊:', chunk);
});
readStream.on('end', () => {console.log('讀完了');
});

9. readline 模塊按行讀取大文件

const fs = require('fs');
const readline = require('readline');const rl = readline.createInterface({input: fs.createReadStream('example.txt'),crlfDelay: Infinity
});rl.on('line', (line) => {console.log(`一行: ${line}`);
});rl.on('close', () => {console.log('文件讀取結束');
});

總結

  • 簡單快速讀小文件fs.readFile() 或同步版本

  • **讀文件片段(低級)**用 fs.read() + fs.open()

  • 大文件流式讀fs.createReadStream()

  • 按行讀可以結合 readline 模塊

  • 底層操作使用 fs.open()fs.read()fs.close()


如果你想,我還可以幫你整理寫文件相關的函數用法,或者把流式讀寫結合的完整例子也給你,告訴我哈!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/85252.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/85252.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/85252.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于二進制XOR運算的機器人運動軌跡與對稱圖像自動生成算法

原創:項道德(daode3056,daode1212) 新的算法出現,往往能給某些行業與產業帶來革命與突破。為探索機器人運動軌跡與對稱圖像自動生成算法,本人已經通過18種算法的測試,最終,以二進制的XOR運算為…

Spring AI 項目實戰(七):Spring Boot + Spring AI Tools + DeepSeek 智能工具平臺(附完整源碼)

系列文章 序號文章名稱1Spring AI 項目實戰(一):Spring AI 核心模塊入門2Spring AI 項目實戰(二):Spring Boot + AI + DeepSeek 深度實戰(附完整源碼)3Spring AI 項目實戰(三):Spring Boot + AI + DeepSeek 打造智能客服系統(附完整源碼)4Spring AI 項目實戰(四…

spring-webmvc @RequestHeader 典型用法

典型用法 基礎用法:獲取指定請求頭值 GetMapping("/info") public String getInfo(RequestHeader("User-Agent") String userAgent) {return "User-Agent: " userAgent; }如果請求中包含 User-Agent 請求頭,則其值將被…

Ubuntu:20.04中安裝docker

是的,您列出的命令是完整的安裝步驟,但為了確保100%可靠性和處理可能的問題,我建議進行以下優化和補充: 完整優化的安裝腳本(包含錯誤處理和驗證) #!/bin/bash# 1. 徹底清理舊版本和配置 sudo apt remove…

大數據實時風控引擎:Spark Streaming、Kafka、Flink與Doris的融合實踐

大數據實時風控引擎:Spark Streaming、Kafka、Flink與Doris的融合實踐 在數字金融、電商交易與在線服務的核心戰場,風險控制能力已成為業務的生命線。傳統批量風控模式在應對瞬息萬變的欺詐攻擊、信用風險時捉襟見肘。本文將深入探討如何利用**Spark St…

【創龍瑞芯微 RK3576 全國產 ARM 八核 2.2GHz 工業開發板-硬件說明書】

前 言 本文主要介紹TL3576-EVM評估板硬件接口資源以及設計注意事項等內容。 RK3576J/RK3576處理器的IO電平標準一般為1.8V、3.3V,上拉電源一般不超過3.3V或1.8V,當外接信號電平與IO電平不匹配時,中間需增加電平轉換芯片或信號隔離芯片。按鍵或接口需考慮ESD設計,ESD器件…

一文吃透ADB,從入門到精通

目錄 一、ADB 簡介1.1 什么是 ADB1.2 ADB 的工作原理1.3 ADB 的安裝與環境配置 二、ADB 基礎命令2.1 設備連接相關命令2.2 應用管理命令2.3 文件傳輸命令 三、ADB 高級命令3.1 ADB Shell 深入探究3.2 日志查看與分析3.3 設備信息獲取3.4 屏幕操作與錄制 四、ADB 常見問題與解決…

PostgreSQL高可用架構設計與實踐指南

# PostgreSQL高可用架構設計與實踐指南 ## 一、高可用性核心訴求 PostgreSQL作為企業級關系型數據庫,高可用設計需要滿足以下關鍵指標: - 故障恢復時間(RTO):秒級到分鐘級自動切換能力 - 數據損失容忍度&#xff0…

今天我想清楚了

首先說一聲抱歉,很多天沒有更新了,因為在我這里,我的內心感到迷茫,從來沒有這樣過,不知道為什么自己一直要做的事,進度太慢了,因為我的人生是空虛的,我感覺我做的不夠好,…

代碼隨想錄day3鏈表1

new關鍵字 1.new是一個關鍵字,用于開辟空間,開辟的空間在堆上,而一般聲明的變量存放在棧上; 2.new得到的是一段空間的首地址。所以一般需要用指針來存放這段地址 new int(10);//返回new出來這塊內存的地址int *pnew int(10);//…

taro小程序如何實現新用戶引導功能?

一、需求背景 1、需要實現小程序新功能引導 2、不使用第三方庫(第三方組件試了幾個,都是各種兼容性問題,放棄) 二、實現步驟 1、寫一個公共的guide組件,代碼如下 components/Guide/index.tsx文件 import React, { …

鍵盤動作可視化技術淺析:如何做到低延遲顯示

在做屏幕錄制或者操作演示的時候,你是否遇到過這樣的問題:觀眾看不清你按了哪個鍵、點了哪里?這是能完美解決這個問題的小工具Keyviz。它可以把你的鍵盤輸入和鼠標點擊實時顯示在屏幕上,清晰直觀,特別適合教學、錄屏、…

Prufer序列 學習筆記

文章目錄 P r u f e r Prufer Prufer 序列對樹建立 P r u f e r Prufer Prufer 序列對 P r u f e r Prufer Prufer 序列重建樹 應用Cayley 公式[HNOI2004] 樹的計數「雅禮集訓 2017 Day8」共[THUPC 2018] 城市地鐵規劃CF156D Clues[ARC106F] Figures P r u f e r Prufer Pruf…

高性能場景使用Protocol Buffers/Apache Avro進行序列化怎么實現呢

我們以Protocol Buffers(Protobuf)和Apache Avro為例,分別展示高性能序列化的實現方式。 由于兩者都需要定義Schema,然后生成代碼,因此步驟包括: 1. 定義Schema文件 2. 使用工具生成Java類 3. 在代碼中…

iOS端網頁調試 debug proxy策略:項目中的工具協同實踐

移動開發中的調試,一直是效率瓶頸之一。特別是當前 Web 前端與 App 原生高度耦合的背景下,頁面調試不僅受限于瀏覽器,還要面對 WebView 實現差異、系統權限控制、設備多樣性等復雜情況。 但我們是否可以構建一套**“設備無關”的調試工作流*…

springboot項目啟動報錯:spring boot application in default package

啟動類報錯: 問題: springboot的啟動方法不能直接在java目錄下 解決: 1.使用CompentScan 和EnableAutoConfiguration注解 2.啟動類放在java目錄下的package目錄下

機器學習實驗報告5-K-means 算法

4.1 k-means算法簡介 聚類分析,作為機器學習領域中的一種無監督學習方法,在數據探索與知識發現過程中扮演著舉足輕重的角色。它能夠在沒有先驗知識或標簽信息的情況下,通過挖掘數據中的內在結構和規律,將數據對象自動劃分為多個類…

【已解決】yoloOnnx git工程部署

首先 yoloonnx一個VS工程下來整個工程大概1-2個g的大小因此在git的過程中總是會因為文件超過100M而觸發報錯,上傳不上去,因此現在需要做一個過濾才能把工程重新上傳上去,那么這個時候別人需要下載下來的時候確實不完整的工程,因此…

如何輕松地將照片從電腦傳輸到安卓手機

一些安卓用戶正在尋找有效可靠的方法,將照片從電腦傳輸到安卓設備。如果您也想將有趣或難忘的照片導入安卓手機或平板電腦,可以參考這篇文章,它提供了 6 種可靠的方法,讓您輕松傳輸照片。 第 1 部分:如何通過 Android …

準備純血鴻蒙理論高級認證的一些心得

最近在準備純血鴻蒙理論高級認證,一些心得記錄下來,希望早日考過高級! 一、考試目標: HarmonyOS核心技術理念HarmonyOS應用架構設計ArkTS原理和實踐ArkUI開發HarmonyOS關鍵技術能力開發工程管理、代碼編輯、調試與定位應用上架運…