編程筆記 Golang基礎 042 文件處理

編程筆記 Golang基礎 042 文件處理

  • 一、文件處理
  • 二、Go語言文件處理
    • 創建文件和寫入內容
    • 打開文件并按模式讀寫
    • 讀取文件內容
    • 更高級的文件和IO操作
    • 改變文件權限
    • 目錄操作
  • 小結

一、文件處理

文件處理是指在計算機科學中,對存儲在磁盤或其他持久性存儲介質上的文件進行的一系列操作。這包括但不限于以下幾個方面:

  1. 文件的創建:創建新的文件,為后續的數據存儲做好準備。

  2. 文件的打開與關閉:通過系統調用或編程語言提供的API打開已存在的文件或者新建的文件,獲取一個指向文件的引用(文件描述符或文件句柄),之后在完成文件操作后,正確地關閉文件以釋放系統資源。

  3. 文件讀取:從文件中讀取數據,可以是字符、字符串、整數或其他數據類型,按照設定的編碼或格式解析內容。

  4. 文件寫入:將數據寫入文件,可以是覆蓋原有內容,也可以是追加到文件末尾。

  5. 文件定位:通過移動文件指針,實現對文件內特定位置的讀寫操作。

  6. 文件刪除:移除不再需要的文件。

  7. 文件屬性修改:改變文件的訪問權限、所有權、時間戳(如最后訪問時間、最后修改時間)等元數據。

  8. 文件復制與移動:在磁盤的不同位置之間復制或移動文件。

  9. 文件搜索與目錄遍歷:查找特定名稱或類型的文件,在目錄結構中導航。

  10. 文件壓縮與解壓縮:對文件進行壓縮節省存儲空間或傳輸時的數據量,解壓縮還原原始文件。

在具體編程實踐中,例如在Go語言中,上述操作可以通過標準庫中的osio等包提供的函數來實現。例如,使用os.Openos.Createos.ReadFileos.WriteFile等函數來進行相應的文件處理任務。同時,針對大文件操作和高效讀寫,還可以利用bufio等額外的庫來優化性能。

二、Go語言文件處理

在 Go 語言中,文件處理涉及到創建、讀取、寫入、追加、關閉文件以及更改文件權限等多種操作。以下是一些關鍵概念和函數的詳解:

創建文件和寫入內容

import ("io/ioutil""os"
)// 使用 ioutil 包一次性創建并寫入文件內容
func writeToFile(filename string, content []byte, perm os.FileMode) error {return ioutil.WriteFile(filename, content, perm)
}// 示例:
data := []byte("Hello, World!")
err := writeToFile("output.txt", data, 0644) // 默認權限為 0644,意味著所有者可讀寫,其他人可讀
if err != nil {panic(err)
}

打開文件并按模式讀寫

import ("os"
)// 使用 os 包打開文件
func openFile(filename string, flag int, perm os.FileMode) (*os.File, error) {return os.OpenFile(filename, flag, perm)
}// 示例:
file, err := openFile("input.txt", os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0644)
if err != nil {panic(err)
}
defer file.Close() // 記得在完成操作后關閉文件// 寫入內容
_, err = file.WriteString("Some text to write")
if err != nil {panic(err)
}// 若要追加內容而不是覆蓋文件,應使用如下模式:
// _, err = openFile("input.txt", os.O_APPEND|os.O_WRONLY, 0644)

讀取文件內容

import ("io/ioutil"
)// 使用 ioutil 包讀取文件全部內容
func readFile(filename string) ([]byte, error) {return ioutil.ReadFile(filename)
}// 示例:
content, err := readFile("input.txt")
if err != nil {panic(err)
}
fmt.Println(string(content))

更高級的文件和IO操作

對于更復雜的文件操作,可能需要用到 bufio(帶緩沖的讀寫)、io.Readerio.Writer 接口,以及 ioutil.ReadAllbufio.NewScanner 等函數。

改變文件權限

import ("os"
)// 改變文件權限
func changePermissions(filename string, mode os.FileMode) error {return os.Chmod(filename, mode)
}// 示例:
err := changePermissions("output.txt", 0755)
if err != nil {panic(err)
}

目錄操作

除了文件外,Go 還提供了對目錄進行操作的函數,如 os.Mkdir 創建目錄,os.RemoveAll 刪除文件或目錄,os.ReadDir 列出目錄內容等。

以上只是文件處理的基本操作,實際使用時請務必處理好錯誤并適時關閉文件以釋放資源。在處理大量數據或進行高性能文件 I/O 操作時,推薦使用 bufioio 庫提供的流式讀寫方式以提高效率。

小結

Go 語言文件處理具有以下特點,總結一下。

  1. 簡潔的API設計
    Go 語言的標準庫 os 提供了一系列簡單直接的函數用于文件操作,如 OpenCreateReadWriteClose 等,使得文件系統的交互直觀易懂。

  2. 零值安全
    Go 語言的文件操作遵循其零值安全的設計理念,如果嘗試對未打開的文件執行讀寫操作,編譯器不會通過編譯,而在運行時也會拋出異常,強制開發者合理地管理文件狀態。

  3. 錯誤處理
    Go 語言強調錯誤處理的重要性,所有的文件操作都可能會返回一個錯誤,要求開發者明確地處理這些潛在的錯誤情況,從而避免因文件操作失敗導致的問題。

  4. 可讀性強
    Go 語言鼓勵簡潔的代碼風格,通過上下文感知的 defer 語句,可以確保文件在操作完成后會被正確關閉,即使在發生錯誤的情況下也能保證資源的釋放。

  5. 異步I/O支持
    雖然標準庫中的文件操作通常是同步的,但 Go 也提供了如 io/ioutil 包的一些便捷函數,以及 io.Pipeio.Copy 等可用于構建異步文件處理流水線的方法。

  6. 操作系統無關性
    Go 語言的文件系統 API 設計為高度可移植的,可以在多種操作系統上正常工作,只需根據目標平臺調用適當的函數即可,無需關心底層細節。

  7. 文件權限管理
    Go 語言提供了設置和修改文件權限的函數,如 os.Chmod,能夠確保文件安全性,符合不同場景下的權限需求。

  8. 目錄操作支持
    不僅支持文件操作,還提供了諸如創建、刪除、遍歷目錄等功能,便于進行更復雜的文件系統管理。

  9. 高效內存管理
    通過 bufio 包可以實現高效的文件讀寫,減少內存分配次數,提升大規模文件操作的性能。

總結來說,Go 語言在文件處理方面結合了簡單的接口設計、嚴格的錯誤處理機制和良好的跨平臺兼容性,同時還考慮到了資源管理、性能優化等實用需求,非常適合進行各種復雜程度的文件系統操作。

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

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

相關文章

Android Jni添加打印(C++打印)

Android Jni添加打印(C打印) 文章目錄 Android Jni添加打印(C打印)一、前言二、添加日志實現1、在某個類上面定義類型和方法2、把日志方法定義在.h文件中定義 myLog.h3、引用打印頭文件的示例代碼(1) MainA…

【詳識JAVA語言】面向對象程序三大特性之三:多態

多態 多態的概念 多態的概念:通俗來說,就是多種形態,具體點就是去完成某個行為,當不同的對象去完成時會產生出不同的狀態。 多態實現條件 在java中要實現多態,必須要滿足如下幾個條件,缺一不可&#xf…

循環隊列與循環雙端隊列

文章目錄 前言循環隊列循環雙端隊列 前言 1、學習循環隊列和循環雙端隊列能加深我們對隊列的理解,提高我們的編程能力。 2、本文循環隊列使用的是數組,循環雙端隊列用的是雙向鏈表 3、題目連接:設計循環隊列 ,設計循環雙端隊列。 …

【機器學習】有監督學習算法之:支持向量機

支持向量機 1、引言2、決策樹2.1 定義2.2 原理2.3 實現方式2.4 算法公式2.5 代碼示例 3、總結 1、引言 小屌絲:魚哥,泡澡啊。 小魚:不去 小屌絲:… 此話當真? 小魚:此話不假 小屌絲:到底去還是…

Linux 網絡接口的混雜模式(Promiscuous mode)認知

寫在前面 博文內容為 混雜模式的簡單認知理解不足小伙伴幫忙指正 認定一件事,即使拿十分力氣都無法完成,也要拿出十二分力氣去努力。 —《劍來》 網絡接口的混雜模式 混雜模式(Promiscuous mode),簡稱 Promisc mode,俗稱監聽模式…

什么是支持向量機(Support vector machine)和其原理

作為機器學習的基礎算法,SVM被反復提及,西瓜書、wiki都能查到詳細介紹,但是總是覺得還差那么點,于是決定自己總結一下。 一、什么是SVM? 1、解決什么問題? SVM,最原始的版本是用于最簡單的線…

藍橋杯備賽第五篇(動態規劃)

1.數位dp public class Main {static long[] limit;static int length;static long[][] dp;public static long dfs(int pos, int pre, boolean flag, boolean lead) {if (pos length) return 1;if (!flag && !lead && dp[pos][pre] ! -1) return dp[pos][pr…

總結 HashTable, HashMap, ConcurrentHashMap 之間的區別

1.多線程環境使用哈希表 HashMap 不行,線程不安全 更靠譜的,Hashtable,在關鍵方法上加了synchronized 后來標準庫又引入了一個更好的解決方案;ConcurrentHashMap 2.HashMap 首先HashMap本身線程不安全其次HashMap的key值可以為空(當key為空時,哈希會…

【Java數據結構】——五道算法題讓你靈活運用Map和Set

目錄 一.只出現一次的數字 二.寶石與石頭 三.舊鍵盤 四.給定一個數組,統計每個元素出現的次數 五.前K個高頻單詞 一.只出現一次的數字 136. 只出現一次的數字 - 力扣(LeetCode) 算法原理:我們將nums中每個元素都存入到set中…

C/C++嵌入式開發環境搭建,Qt交叉編譯,cmake交叉編譯,clion/vscode遠程開發

目錄 交叉編譯簡介cmake 交叉編譯clion 交叉編譯vscode 遠程嵌入式開發Qt交叉編譯1.安裝交叉編譯工具2.交叉編譯qt庫3.將交叉編譯的Qt庫復制到板子上4.安裝和配置 Qt Creator,支持交叉編譯5.QT嵌入式開發6.QT嵌入式開發報錯解決QIconvCodec::convertToUnicode: usin…

ASUS華碩天選5筆記本電腦FX607JV原裝出廠Win11系統下載

ASUS TUF Gaming F16 FX607JV天選五原廠Windows11系統 適用型號: FX607JU、FX607JI、FX607JV、 FX607JIR、FX607JVR、FX607JUR 下載鏈接:https://pan.baidu.com/s/1l963wqxT0q1Idr98ACzynQ?pwd0d46 提取碼:0d46 原廠系統自帶所有驅動、…

TypeScript中 “ <> “ 語法 和 “ : “ 怎么使用

在 TypeScript 中&#xff0c;尖括號語法(<Type>)和as關鍵字(value as Type)都是用于類型斷言&#xff0c;而冒號(:)用于類型注解。這三種語法在不同的場景下使用&#xff1a; 尖括號語法和as關鍵字&#xff1a; 尖括號語法(<Type>value)&#xff1a; 這種語法在…

[LeetBook]【學習日記】鏈表反轉

來源于「Krahets」的《圖解算法數據結構》 https://leetcode.cn/leetbook/detail/illustration-of-algorithm/ 鏈表反轉的遞歸要點 遞歸終止條件為當前節點為空&#xff0c;表明遍歷到了鏈表尾部遞歸函數傳入參數為當前節點的下一個節點按照是否重新開辟存儲空間分類下面只寫…

python自動化學習--3.8python操作EXCEL文件python日志收集處理

1、Excel文件處理 安裝 openpxl 第三方庫 openpxl 模塊三大組件: 1、工作簿 &#xff08;包含多個sheet工作表&#xff09; 2、工作表 &#xff08;某個數據包含在某個工作表&#xff09; 3、單元格 1、創建excel工作簿 import openpyxl"""Excel表格的創建…

【簡說八股】Spring事務失效可能是哪些原因?

Spring事務介紹 Spring事務是指在Spring框架中對數據庫操作進行管理的一種機制&#xff0c;它確保一組數據庫操作要么完全執行成功&#xff08;提交&#xff09;&#xff0c;要么完全不執行&#xff08;回滾&#xff09;&#xff0c;從而保持數據一致性和完整性。 Spring框架…

GotoXy控制臺光標的位置更新

光標控制解釋 控制臺的光標更新方法, 用于控制數據輸出位置 void gotoXY(int x, int y)//新函數&#xff1a;更新光標 {COORD c;c.X x;c.Y y;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), c); }代碼解釋 這段代碼定義了一個名為 gotoXY 的函數&#xff0c;…

設計模式-裝飾者模式應用實踐

裝飾者模式&#xff08;Decorator Pattern&#xff09;是一種結構型設計模式&#xff0c;它允許動態地向一個現有的對象添加新的功能&#xff0c;同時不改變其結構。這種模式通過創建一個裝飾類來包裝原有的類&#xff0c;提供額外的行為。 下面是一個使用 Java 實現裝飾者模式…

【Spring Boot】實現全局異常處理

1.定義基礎異常接口類 /*** description: 服務接口類* author: MrVK* date: 2021/4/19 21:39*/ public interface BaseErrorInfoInterface {/*** 錯誤碼* return*/String getResultCode();/*** 錯誤描述* return*/String getResultMsg(); } 2.定義錯誤處理枚舉類 /*** desc…

小伙伴詢問AI該怎么學習?本人的一點總結,以思維導圖呈現

如有需要思維導圖的在后臺請留郵箱&#xff0c;相關知識結構目錄 部分導圖

nn.Linear() 使用提醒

原本以為它是和nn.Conv2d()一樣&#xff0c;就看第二個維度的數值&#xff0c;今天才知道&#xff0c;它是只看最后一個維度的數值&#xff01;&#xff01;&#xff01; 例子1 Descripttion: Result: Author: Philo Date: 2024-02-27 14:33:50 LastEditors: Philo LastEditT…