Go語言中的文件與IO:bufio 和 scanner

Go 標準庫中的?bufio?包提供了帶緩沖的讀寫功能,可以顯著提高文件和數據處理效率。而?bufio.Scanner?則是讀取文本文件中每一行的利器,常用于日志、配置等文本處理場景。


一、為什么使用?bufio

直接對文件進行?os.File.Read()?或?os.File.Write()?操作是無緩沖的,每次調用都會進行系統調用,效率較低。

bufio?在內部使用內存緩沖區,減少與操作系統的交互,性能提升明顯。


二、bufio.Reader:帶緩沖的讀取

示例:讀取文件內容并逐行輸出
file,?err?:=?os.Open("sample.txt")
if?err?!=?nil?{log.Fatal(err)
}
defer?file.Close()reader?:=?bufio.NewReader(file)for?{line,?err?:=?reader.ReadString('\n')if?err?==?io.EOF?{break}if?err?!=?nil?{log.Fatal(err)}fmt.Print(line)
}
方法說明:
  • ??ReadString(delim byte):讀到指定分隔符為止(如?\n)。
  • ??ReadBytes(delim byte):與?ReadString?類似,但返回字節切片。
  • ??ReadLine():低級函數,建議用?Scanner?替代。
  • ??Peek(n int):讀取但不消費前?n?個字節。

三、bufio.Writer:帶緩沖的寫入

file,?_?:=?os.Create("output.txt")
defer?file.Close()writer?:=?bufio.NewWriter(file)
writer.WriteString("Hello,?buffered?write!\n")
writer.Flush()?//?必須顯式刷新緩沖區

注意:?使用?bufio.Writer?寫入數據后,需要調用?Flush()?將數據寫入底層文件或網絡連接,否則可能數據不會立即寫入。


四、bufio.Scanner:按行或自定義分隔符掃描輸入

1. 按行讀取文本文件
file,?_?:=?os.Open("sample.txt")
defer?file.Close()scanner?:=?bufio.NewScanner(file)
for?scanner.Scan()?{fmt.Println(scanner.Text())
}if?err?:=?scanner.Err();?err?!=?nil?{log.Fatal(err)
}
2. 自定義分隔符(如按空格、逗號、段落分隔)
scanner?:=?bufio.NewScanner(strings.NewReader("go?is?simple.?go?is?fast."))//?自定義按單詞分割
scanner.Split(bufio.ScanWords)for?scanner.Scan()?{fmt.Println(scanner.Text())
}
常見分割器:
  • ??bufio.ScanLines(默認)
  • ??bufio.ScanWords
  • ??bufio.ScanBytes

五、Scanner 與大文件的關系

  • ??Scanner?默認緩沖區大小為 64K,如需處理超大行文本,可以通過?scanner.Buffer()?提高上限:
scanner.Buffer(make([]byte,?1024),?10*1024*1024)?//?提升最大支持到10MB

六、小結

類型功能適合場景
bufio.Reader提供高效逐行或按字節讀取網絡流、日志、長行文本等
bufio.Writer高效寫入并可緩沖寫文件、網絡輸出
bufio.Scanner方便讀取行、單詞等小粒度內容配置文件、日志文件、終端輸入

七、建議實踐練習

  1. 1. 寫一個程序,讀取大文件并統計每一行的字符數。
  2. 2. 模擬 tail -f,持續從文件末尾讀取新增內容。
  3. 3. 實現一個按單詞頻率排序的詞頻統計器。

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

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

相關文章

ABP微服務架構中網關層NullReferenceException問題解析與HTTP配置優化

ABP微服務架構中網關層NullReferenceException問題解析與HTTP配置優化 一、網關層System.NullReferenceException問題解析 1.1 問題現象與原因分析 在ABP微服務架構開發過程中,網關層啟動后調用微服務接口時出現以下異常: System.NullReferenceExcep…

啊啊啊啊啊啊啊啊code

前序遍歷和中序遍歷構建二叉樹 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNod…

【算法 day06】LeetCode 454.四數相加II | 15. 三數之和 | 18. 四數之和

454.四數相加II 題目鏈接 | 文檔講解 |視頻講解 : 鏈接 1.思路: 0.定義一個count,計算最終出現的次數 1.先遍歷nums1和nums2,求出兩者的和,map的key是和,value是出現的次數 2.再遍歷nums3和nums4,求出0-兩者的和 3…

【項目實訓】【項目博客#09】HarmonySmartCodingSystem系統后端智能API檢索與代碼助手實現(6.2-6.15)

【項目實訓】【項目博客#09】HarmonySmartCodingSystem系統后端智能API檢索與代碼助手實現(6.2-6.15) 文章目錄 【項目實訓】【項目博客#09】HarmonySmartCodingSystem系統后端智能API檢索與代碼助手實現(6.2-6.15)項目博客概述一…

【JVM】- 類加載與字節碼結構3

類加載階段 1. 加載 加載:將類的字節碼載入方法區中,內部采用C的instanceKlass描述java類。如果這個類的父類還沒加載,則先加載父類加載和鏈接可能是交替運行的 通過全限定名獲取字節碼 從文件系統(.class 文件)、JA…

Qt藍圖式技能編輯器狀態機模塊設計與實現

設計概述 這個模塊是一個基于Qt的藍圖式技能編輯器狀態機,主要用于游戲開發中的技能狀態管理。核心功能包括: 狀態節點(開始、結束、普通狀態)的可視化 狀態間連線的繪制與管理 狀態轉換邏輯的可視化編輯 動作選擇與配置 核…

Unity AR識別物體的內容語音讀取+使用說明功能

因之前一直在開發項目,斷斷續續寫了一點博客,最后統一寫了一下博客記錄學習內容。 可以看到我的工作一直在進行。 目錄 一、識別內容語音讀取 二、點擊齒輪按鈕彈出使用說明界面 開發步驟 1. 創建齒輪按鈕 UI 2. 創建使用說明面板 UI 3. 編寫控制…

Unable to start embedded Tomcat

通常是由于xml文件配置錯誤導致 1. mapper 指向錯誤 <resultMap id"Waybill" type"c.Waybill"> 2. 字段類型錯誤 <result column"wstatus" property"stus" javaType"TINYINT"/>TINYINT 是數據庫類型<resu…

Mac電腦 充電限制保護工具 AlDente Pro

AlDente Pro一款充電限制保護工具&#xff0c;是可以限制最大充電百分比來保護電池的工具。 鋰離子和聚合物電池&#xff08;如 MacBook 中的電池&#xff09;在40&#xff05; 至 80&#xff05; 之間運行時&#xff0c;使用壽命最長。 始終將電池電量保持在 100&#xff05…

KungfuBot——基于物理約束和自適應運動追蹤的人形全身控制PBHC,用于學習打拳或跳舞(即RL下的動作模仿和運控)

前言 昨天618&#xff0c;我司「七月在線」同事朝陽為主力&#xff0c;我打雜&#xff0c;折騰了整整一天&#xff0c;終于可以通過VR搖操宇樹G1了——當然&#xff0c;搖操是為了做訓練數據的采集&#xff0c;從而方便 下一步的模型(策略)訓練&#xff0c;最終實現機器人自主…

Kafka多副本機制

副本和副本因子 Kafka 會為每個 Partition 創建多個副本。這些副本分布在不同的 Broker 上。副本確保了數據的冗余存儲&#xff0c;即使某個 Broker 宕機或失效&#xff0c;其他副本可以繼續提供服務。 副本因子指的是每個 Partition 有多少個副本。副本因子的設置決定了一個…

Vue3類似百度風格搜索框組件

Vue3百度風格搜索框組件&#xff0c;使用vue3進行設計&#xff0c;亦有vue3TS的版本。 vue3組件如下&#xff1a; <template><!-- 搜索組件容器 --><div class"search-container"><!-- 百度Logo - 新樣式 --><div class"logo-conta…

智凈未來:華為智選IAM以科技巧思優化家庭健康飲水體驗

在中國家庭中&#xff0c;凈水器早已成為廚房標配&#xff0c;但傳統凈水設備的使用體驗卻遠未達到理想狀態。根據《2023年中國家庭凈水器使用調研報告》顯示&#xff0c;超過65%的用戶對傳統凈水器存在不滿&#xff0c;主要痛點集中在功能單一、操作復雜、維護麻煩、噪音大、廢…

細說STM32單片機SPI-Flash芯片的FatFS移植

目錄 一、SPI-Flash芯片硬件電路 二、CubeMX項目基礎設置 1、RCC、SYS、Code Generator、USART6、NVIC 2、RTC 3、SPI2 4、GPIO 5、FatFS模式 6、FatFS參數設置概述 &#xff08;1&#xff09;Version組 &#xff08;2&#xff09;Function Parameters組 1&#x…

ubuntu 22.04 安裝部署logstash 7.10.0詳細教程

安裝部署logstash 7.10.0詳細教程 一、下載并安裝二、新建配置文件三、賦權文件權限四、檢測文件grok語法是否異常五、啟動服務六、安裝啟動常見問題 【背景】 整個elk安裝是基于ubuntu 22.04和jdk 11環境。logstash采用 *.deb方式安裝&#xff0c;需要服務器能聯網。ubuntu 22…

JVM對象創建與內存分配機制深度剖析

對象創建的主要流程 類加載檢查 在創建對象之前&#xff0c;JVM 首先會檢查該類是否已經加載、解析并初始化&#xff1a; 如果沒有&#xff0c;則會通過類加載機制加載類元信息&#xff08;Class Metadata&#xff09;到方法區。 這個過程包括&#xff1a;加載&#xff08;load…

Navicat 技術指引 | TiDB 的 AI 查詢交互功能

目前&#xff0c;Navicat 兩款工具支持對 TiDB 數據庫的管理開發功能&#xff1a;一款是旗艦款 Navicat Premium&#xff0c;另一款是其輕量化功能的 Navicat Premium Lite&#xff08;官方輕量級免費版&#xff09;。Navicat 自版本 17.1 開始支持 TiDB 7。它支持的系統有 Win…

以list為輸入條件,查詢數據庫表,java中的mapper層和mybatis層應該怎么寫?

根據一個 List 中的兩個字段 rangeCode 和 unitcd&#xff0c;查詢數據庫表 model_engineering_spatial_unit。這個需求在 Java MyBatis 項目中非常常見&#xff0c;下面我將為你詳細寫出 Mapper 接口&#xff08;Java&#xff09; 和 MyBatis XML 映射文件 的寫法。 ? 前提…

pyspark 創建DataFrame

from pyspark.sql import SparkSession from pyspark.sql import StructType, StructField, IntegerType,StringType spark SparkSession.builder.appName(test).getOrCreate() 1、 從列表中創建DataFrame data [(1,"alice"),(2,Blob),(3,Charlie)] columns [&qu…

Vim:從入門到進階的高效文本編輯器之旅

目錄 一、Vim簡介 二、Vim的基礎操作 2.1 進入和退出Vim 2.2 Vim的三種模式 2.3 基礎移動 三、Vim的高效編輯技巧 3.1 文本編輯 3.2 文本刪除與修改 3.3 復制與粘貼 四、Vim的進階使用 4.1 搜索與替換 4.2 寄存器與宏 4.3 插件與配置 五、結語 在編程界&#xff0…