【.NET Core】深入理解IO - 讀取器和編寫器

【.NET Core】深入理解IO - 讀取器和編寫器

文章目錄

  • 【.NET Core】深入理解IO - 讀取器和編寫器
    • 一、概述
    • 二、BinaryReader和BinaryWriter
      • 2.1 BinartReader類
      • 2.2 BinaryWriter類
    • 三、StreamReader和StreamWriter
      • 3.1 StreamReader類
      • 3.1 StreamWriter類
        • StreamWriter類構造函數
        • StreamWriter類屬性
        • StreamWriter類常用方法
        • StreamWriter使用示例

在這里插入圖片描述

一、概述

System.IO名空間還提供用于在流中讀取和寫入已編碼字符的類型。 通常,流用于字節輸入和輸出。 讀取器和編寫器類型處理編碼字符與字節之間的來回轉換,以便流可以完成操作。 每個讀取器和編寫器類都與流關聯,可以通過類的 BaseStream 屬性進行檢索。

System.IO常用一些常用的讀取器和編寫器類:

  • BinaryReaderBinaryWriter - 用于將基元數據類型作為二進制值進行讀取和寫入。
  • StreamReaderStreamWriter - 用于通過使用編碼值在字符和字節之間來回轉換來讀取和寫入字符。
  • StringReaderStringWriter - 用于從字符串讀取字符以及將字符寫入字符串中。
  • TextReaderTextWriter - 用作其他讀取器和編寫器(讀取和寫入字符和字符串,而不是二進制數據)的抽象基類。

下面的篇幅將詳細介紹常用的讀取器和編寫器。

二、BinaryReader和BinaryWriter

C#提供比較全面對文件讀寫及其傳輸功能的類,在我們需要在字節級別上操作文件,卻又不是一個字節一個字節的操作,通常是2個、4個或8個字節這樣操作,這便有了BinaryReaderBinaryWriter類,它們可以將一個字符或數字按指定個數字節寫入,也可以一次讀取指定一個字節轉為字符或數字。

2.1 BinartReader類

BinartReader類用特定的編碼將基元數據類型讀作二進制值

  • 常用的方法
序號方法說明
1Close關閉當前閱讀器及基礎流
2Read從基礎流中讀取字符,并提升流的當前位置
3ReadBytes從當前流將count個字節讀入字節數組,并使當前位置提升count個字節
4ReadInt32從當前流中讀取4個字節有符號整數,并使流的當前位置提升4個字節
5ReadString從當前流讀取一個字符串。字符串有長度前綴,一次7位地被編碼為整數
  • 示例
using (FileStream fs=new FileStream(path,FileMode.Open,FileAccess.Read))
{BinaryReader br = new BinaryReader(fs);//以二進制方式讀取文件中的內容  bool b = br.ReadBoolean();double d = br.ReadDouble();float f = br.ReadSingle();int i = br.ReadInt32();string s = br.ReadString();//打印每個值Console.WriteLine("{0},{1},{2},{3},{4}",b,d,f,i,s);//關閉流br.Close();fs.Close();
}

2.2 BinaryWriter類

BinaryWriter 類以二進制形式將基元類型寫入流,并支持用特定的編碼寫入字符串。

  • 常用的方法
序號方法說明
1Close關閉當前的BinaryWriter和基礎流
2Seek設置當前流中的位置
3Write將值寫入當前流
  • 示例
using (FileStream fs=new FileStream(path,FileMode.OpenOrCreate))
{BinaryWriter bw=new BinaryWriter(fs);//以二進制方式向創建的文件中寫入內容   bw.Write(588);              //  整型  bw.Write(58.8f);            // 浮點型  bw.Write(58.8);             // double型  bw.Write(true);             // 布爾型  bw.Write("程序人生道可道");  // 字符串型  //關閉流bw.Close();fs.Close();
}

三、StreamReader和StreamWriter

C# 除了使用FileStream類讀寫文件,還提供專門處理文本文件的兩個操作類StreamWriterStreamReader。這兩個類從底層封裝了文件流,讀寫時不用重新編碼,提供了更文件的讀寫方式。

3.1 StreamReader類

StreamReader 用于讀取標準文本文件中的信息,而 Stream 類用于字節輸入和輸出;StreamReader 除非另外指定,否則默認為 UTF-8 編碼。如果使用屬性獲取當前字符編碼,則 CurrentEncoding 該值在第一種方法之后才是可靠的 Read ,因為在首次調用方法之前不會進行編碼自動檢測 Read 。

StreamReader不是線程安全的,如果要使線程安全請使用TextReader.Synchronized

  • StreamReader屬性
序號屬性名說明
1BaseStream返回基礎流
2CurrentEncoding獲取當前 StreamReader 對象正在使用的當前字符編碼
3EndOfStream獲取一個值,該值指示當前的流位置是否在流結尾。
  • StreamReader方法
序號方法說明
1Close()關閉 StreamReader 對象和基礎流,并釋放與讀取器關聯的所有系統資源。
2DiscardBufferedData()清除內部緩沖區。
3Dispose(Boolean)關閉基礎流,釋放 StreamReader 使用的未托管資源,同時還可以根據需要釋放托管資源。
4Peek()返回下一個可用字符,但不使用它
5Read(Char[], Int32, Int32)從指定的索引位置開始將來自當前流的指定的最多字符讀到緩沖區。
6ReadLine()從當前流中讀取一行字符并將數據作為字符串返回。
7ReadToEnd()讀取來自流的當前位置到結尾的所有字符。
  • 示例
public async Task ReadAndDisplayFilesAsync()
{String filename = "TestFile1.txt";Char[] buffer;using (var sr = new StreamReader(filename)) {buffer = new Char[(int)sr.BaseStream.Length];await sr.ReadAsync(buffer, 0, (int)sr.BaseStream.Length);}Console.WriteLine(new String(buffer));
}

3.1 StreamWriter類

StreamWriter實現一個TextWriter,使其以一種特定的編碼向流中寫入字符;StreamWrite專用于特定編碼的字符輸出,而從派生的類 Stream 則設計用于字節輸入和輸出。StreamWriter 除非另外指定,否則默認為使用實例 UTF8Encoding。

  • StreamWriter類構造函數
序號構造函數說明
1StreamWriter(Stream)使用 UTF-8 編碼及默認的緩沖區大小,為指定的流,初始化 StreamWriter 類的新實例
2StreamWriter(Stream, Encoding)使用指定的編碼及默認的緩沖區大小,為指定的流,初始化 StreamWriter 類的新實例
3StreamWriter(Stream, Encoding, Int32)使用指定的編碼及緩沖區大小,為指定的流,初始化 StreamWriter 類的新實例
4StreamWriter(String)用默認編碼和緩沖區大小,為指定的文件初始化 StreamWriter 類的一個新實例
5StreamWriter(String, Boolean, Encoding)使用指定的編碼和默認的緩沖區大小,為指定的文件,初始化 StreamWriter 類的新實例。 如果該文件存在,則可以將其覆蓋或向其追加。 如果該文件不存在,此構造函數將創建一個新文件
6StreamWriter(String, Boolean, Encoding, Int32)使用指定編碼和緩沖區大小,為指定路徑上的指定文件,初始化 StreamWriter 類的新實例。 如果該文件存在,則可以將其覆蓋或向其追加。 如果該文件不存在,此構造函數將創建一個新文件。
  • StreamWriter類屬性
序號屬性說明
1AutoFlush獲取或設置一個值,該值指示 StreamWriter 在每次調用 Write(Char) 之后是否都將其緩沖區刷新到基礎流
2BaseStream獲取同后備存儲連接的基礎流
3Encoding獲取在其中寫入輸出的 Encoding
4FormatProvider獲取控制格式設置的對象
5NewLine獲取或設置由當前 TextWriter 使用的行結束符字符串
  • StreamWriter類常用方法
序號方法說明
1Close關閉當前 StreamWriter 對象和基礎流
2Dispose使所有緩沖數據寫入基礎流,釋放 StreamWriter 使用的非托管資源,同時還可以根據需要釋放受管理資源
3Flush清理當前寫入器的所有緩沖區,并使所有緩沖數據寫入基礎流
4Write清理當前寫入器的所有緩沖區,并使所有緩沖數據寫入基礎流
  • StreamWriter使用示例
string path = @"G:\GoyeerOutput\Version.txt";using (StreamWriter StrWt = new StreamWriter(path, true))//true的作用是給文件新增字符,不覆蓋
{StrWt.Write("5)使用StreamWriter寫入的字符串");
}
using (StreamReader sr = new StreamReader(path))
{// 這允許您執行一次讀取操作.Console.WriteLine(sr.ReadToEnd());
}

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

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

相關文章

Leetcode 3072. Distribute Elements Into Two Arrays II

Leetcode 3072. Distribute Elements Into Two Arrays II 1. 解題思路2. 代碼實現 題目鏈接:3072. Distribute Elements Into Two Arrays II 1. 解題思路 這一題不太明白為啥被劃分為了hard的題目,我們只需要按照題意構造一下arr1和arr2即可&#xff…

優化自動窗簾系統

要優化自動窗簾系統的代碼,我們可以考慮以下幾個方面: (1)模塊化設計:將不同的功能(如讀取光強度、控制窗簾等)分解成獨立的函數,以提高代碼的可讀性和可維護性。 (2)錯誤處理:增加錯誤處理機制…

【Vue】探究 Vue 2 與 Vue 3 生命周期:變化與延續

💗💗💗歡迎來到我的博客,你將找到有關如何使用技術解決問題的文章,也會找到某個技術的學習路線。無論你是何種職業,我都希望我的博客對你有所幫助。最后不要忘記訂閱我的博客以獲取最新文章,也歡…

paper-ai :搜索真實文獻并生成引用真實文獻的AI論文

paper-ai :搜索真實文獻并生成引用真實文獻的AI論文。 項目簡介 使用真實文獻最快速完成論文的方法 利用人工智能撰寫論文 人工智能書寫功能:點擊 "AI 寫作 "進行正常對話互動。人工智能將根據您的輸入提供寫作建議或回答問題。 尋找文獻功能…

C/C++工程師面試題(STL篇)

STL 中有哪些常見的容器 STL 中容器分為順序容器、關聯式容器、容器適配器三種類型,三種類型容器特性分別如下: 1. 順序容器 容器并非排序的,元素的插入位置同元素的值無關,包含 vector、deque、list vector:動態數組…

DocxToDoc.java

DocxToDoc.java word高版本docx轉化word2003版本 package word;import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException;import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.apache.poi.xwpf.usermodel.XWPFParagrap…

【Ubuntu 20.04 / 22.04 LTS】最新 esp-matter SDK 軟件編譯環境搭建步驟

倉庫鏈接:esp-matter SDK官方軟件說明:ESP Matter Programming Guide官方參考文檔:使用 Matter-SDK 快速搭建 Matter 環境 (Linux) 環境要求 Ubuntu 20.04 或 Ubuntu22.04網絡環境支持訪問 Gihub 在安裝 esp-matter SDK 軟件編譯環境之前&a…

三八女神節特別推薦:完美禮物俘獲她的芳心

三八女神節馬上就要到了,這是一個贊頌女性獨立、堅韌與美麗的時刻。在這個充滿溫馨與敬意的日子里,很多人想要為那些綻放光彩的女性們獻上一份特別的禮物。這不僅是一份物質上的饋贈,更是一份心靈上的交流,一次情感上的共鳴。 真…

面試經典150題——簡化路徑

"A goal is a dream with a deadline." - Napoleon Hill 1. 題目描述 2. 題目分析與解析 2.1 思路一 這個題目開始看起來并不太容易知道該怎么寫代碼,所以不知道什么思路那就先模擬人的行為,比如對于如下測試用例: 首先 /代表根…

手把手教會你使用Markdown【從入門到精通一篇就夠了】

手把手教會你使用Markdown【從入門到精通一篇就夠了】 前言一、Markdown是什么二、Markdown優點三、Markdown的基本語法3.1 標題3.2 字體3.3 換行3.4 引用3.5 鏈接3.6 圖片3.7 列表3.8 分割線3.9 刪除線3.10 下劃線3.11 代碼塊3.12 表格3.13 腳注3.14 特殊符號 四、Markdown的高…

UCSF DOCK 分子對接詳細案例(04)-基于RDKit描述符的分子從頭設計DOCK_D3N

歡迎瀏覽我的CSND博客! Blockbuater_drug …點擊進入 文章目錄 前言一、 軟件及操作環境二、研究目的三、結構文件準備四、 DOCK/RDKit中 de novo design4.1 de novo design - refine_D3N4.2 對輸出重新評分 總結參考資料 前言 本文是UCSF DOCK的使用案例分享&…

lv20 QT事件5

1 事件模型 2 事件處理 virtual void keyPressEvent(QKeyEvent *event) virtual void keyReleaseEvent(QKeyEvent *event) virtual void mouseDoubleClickEvent(QMouseEvent *event) virtual void mouseMoveEvent(QMouseEvent *event) virtual void mousePressEvent(QMou…

【短時交通流量預測】基于Elman神經網絡

課題名稱:基于Elman神經網絡的短時交通流量預測 版本時間:2023-04-27 代碼獲取方式:QQ:491052175 或者 私聊博主獲取 模型簡介: 城市交通路網中交通路段上某時刻的交通流量與本路段前幾個時段的交通流量有關&#…

自己拍攝的視頻能做成二維碼嗎?快速在線生碼該怎么操作?

自己拍攝的視頻能做成二維碼嗎?現在掃描二維碼用來播放視頻的使用場景越來越多,這種方式的流行在于能夠通過更低的成本獲取更好的效果,有效的提升用戶獲取視頻內容的體驗,通過消耗流量就可以播放視頻。 那么視頻制作二維碼一般會…

vue2 vue-router源碼解析

目錄 Vue Router 的基本結構和功能 源碼分析 一. 編寫install 方法 二 .生命變量存儲路由信息和當前路由 三 .初始化路由 把路由信息記錄在routeMap中 四.注冊router-link 和router-view 組件 Vue Router 的基本結構和功能 路由器實例(Router 實例)…

Vue.js 修飾符:精準控制組件行為

🤍 前端開發工程師、技術日更博主、已過CET6 🍨 阿珊和她的貓_CSDN博客專家、23年度博客之星前端領域TOP1 🕠 牛客高級專題作者、打造專欄《前端面試必備》 、《2024面試高頻手撕題》 🍚 藍橋云課簽約作者、上架課程《Vue.js 和 E…

多點通信與域套接字:2024/3/4

作業1&#xff1a;廣播 發送端&#xff1a; #include <myhead.h> int main(int argc, const char *argv[]) {//1.創建套接字int sfdsocket(AF_INET,SOCK_DGRAM,0);if(sfd-1){perror("socket error");return -1;}printf("sfd%d\n",sfd);//2.設置當前…

藍橋杯復習之前綴和

題目鏈接&#xff1a;https://www.luogu.com.cn/problem/P8649 思路&#xff1a; 看到區間和&#xff0c;第一反應肯定是前綴和&#xff0c;我們求出前綴和后對前綴和數組每一個值模k&#xff0c;然后對一個數組的值查看前面有幾個相同的&#xff0c;舉個例子&#xff1a;…

【python 常見錯誤】

標題【python 常見錯誤】 一、python 常見錯誤 Python編程過程中&#xff0c;開發者可能會遇到多種類型的錯誤。這些錯誤大致可以分為三類&#xff1a;語法錯誤&#xff08;SyntaxError&#xff09;、邏輯錯誤和運行時錯誤。下面將詳細介紹這幾種錯誤類型&#xff0c;并提供相…

【動態規劃】第十一屆藍橋杯省賽第二場C++ C組《數字三角形》(c++)

1.題目描述 上圖給出了一個數字三角形。 從三角形的頂部到底部有很多條不同的路徑。 對于每條路徑&#xff0c;把路徑上面的數加起來可以得到一個和&#xff0c;你的任務就是找到最大的和。 路徑上的每一步只能從一個數走到下一層和它最近的左邊的那個數或者右邊的那個數。 …