【.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
常用一些常用的讀取器和編寫器類:
BinaryReader
和BinaryWriter
- 用于將基元數據類型作為二進制值進行讀取和寫入。StreamReader
和StreamWriter
- 用于通過使用編碼值在字符和字節之間來回轉換來讀取和寫入字符。StringReader
和StringWriter
- 用于從字符串讀取字符以及將字符寫入字符串中。TextReader
和TextWriter
- 用作其他讀取器和編寫器(讀取和寫入字符和字符串,而不是二進制數據)的抽象基類。
下面的篇幅將詳細介紹常用的讀取器和編寫器。
二、BinaryReader和BinaryWriter
C#提供比較全面對文件讀寫及其傳輸功能的類,在我們需要在字節級別上操作文件,卻又不是一個字節一個字節的操作,通常是2個、4個或8個字節這樣操作,這便有了BinaryReader
和BinaryWriter
類,它們可以將一個字符或數字按指定個數字節寫入,也可以一次讀取指定一個字節轉為字符或數字。
2.1 BinartReader類
BinartReader類用特定的編碼將基元數據類型讀作二進制值
- 常用的方法
序號 | 方法 | 說明 |
---|---|---|
1 | Close | 關閉當前閱讀器及基礎流 |
2 | Read | 從基礎流中讀取字符,并提升流的當前位置 |
3 | ReadBytes | 從當前流將count個字節讀入字節數組,并使當前位置提升count個字節 |
4 | ReadInt32 | 從當前流中讀取4個字節有符號整數,并使流的當前位置提升4個字節 |
5 | ReadString | 從當前流讀取一個字符串。字符串有長度前綴,一次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 類以二進制形式將基元類型寫入流,并支持用特定的編碼寫入字符串。
- 常用的方法
序號 | 方法 | 說明 |
---|---|---|
1 | Close | 關閉當前的BinaryWriter和基礎流 |
2 | Seek | 設置當前流中的位置 |
3 | Write | 將值寫入當前流 |
- 示例
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
類讀寫文件,還提供專門處理文本文件的兩個操作類StreamWriter
和StreamReader
。這兩個類從底層封裝了文件流,讀寫時不用重新編碼,提供了更文件的讀寫方式。
3.1 StreamReader類
StreamReader
用于讀取標準文本文件中的信息,而 Stream 類用于字節輸入和輸出;StreamReader 除非另外指定,否則默認為 UTF-8 編碼。如果使用屬性獲取當前字符編碼,則 CurrentEncoding 該值在第一種方法之后才是可靠的 Read ,因為在首次調用方法之前不會進行編碼自動檢測 Read 。
StreamReader
不是線程安全的,如果要使線程安全請使用TextReader.Synchronized
。
- StreamReader屬性
序號 | 屬性名 | 說明 |
---|---|---|
1 | BaseStream | 返回基礎流 |
2 | CurrentEncoding | 獲取當前 StreamReader 對象正在使用的當前字符編碼 |
3 | EndOfStream | 獲取一個值,該值指示當前的流位置是否在流結尾。 |
- StreamReader方法
序號 | 方法 | 說明 |
---|---|---|
1 | Close() | 關閉 StreamReader 對象和基礎流,并釋放與讀取器關聯的所有系統資源。 |
2 | DiscardBufferedData() | 清除內部緩沖區。 |
3 | Dispose(Boolean) | 關閉基礎流,釋放 StreamReader 使用的未托管資源,同時還可以根據需要釋放托管資源。 |
4 | Peek() | 返回下一個可用字符,但不使用它 |
5 | Read(Char[], Int32, Int32) | 從指定的索引位置開始將來自當前流的指定的最多字符讀到緩沖區。 |
6 | ReadLine() | 從當前流中讀取一行字符并將數據作為字符串返回。 |
7 | ReadToEnd() | 讀取來自流的當前位置到結尾的所有字符。 |
- 示例
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。
序號 | 構造函數 | 說明 |
---|---|---|
1 | StreamWriter(Stream) | 使用 UTF-8 編碼及默認的緩沖區大小,為指定的流,初始化 StreamWriter 類的新實例 |
2 | StreamWriter(Stream, Encoding) | 使用指定的編碼及默認的緩沖區大小,為指定的流,初始化 StreamWriter 類的新實例 |
3 | StreamWriter(Stream, Encoding, Int32) | 使用指定的編碼及緩沖區大小,為指定的流,初始化 StreamWriter 類的新實例 |
4 | StreamWriter(String) | 用默認編碼和緩沖區大小,為指定的文件初始化 StreamWriter 類的一個新實例 |
5 | StreamWriter(String, Boolean, Encoding) | 使用指定的編碼和默認的緩沖區大小,為指定的文件,初始化 StreamWriter 類的新實例。 如果該文件存在,則可以將其覆蓋或向其追加。 如果該文件不存在,此構造函數將創建一個新文件 |
6 | StreamWriter(String, Boolean, Encoding, Int32) | 使用指定編碼和緩沖區大小,為指定路徑上的指定文件,初始化 StreamWriter 類的新實例。 如果該文件存在,則可以將其覆蓋或向其追加。 如果該文件不存在,此構造函數將創建一個新文件。 |
序號 | 屬性 | 說明 |
---|---|---|
1 | AutoFlush | 獲取或設置一個值,該值指示 StreamWriter 在每次調用 Write(Char) 之后是否都將其緩沖區刷新到基礎流 |
2 | BaseStream | 獲取同后備存儲連接的基礎流 |
3 | Encoding | 獲取在其中寫入輸出的 Encoding |
4 | FormatProvider | 獲取控制格式設置的對象 |
5 | NewLine | 獲取或設置由當前 TextWriter 使用的行結束符字符串 |
序號 | 方法 | 說明 |
---|---|---|
1 | Close | 關閉當前 StreamWriter 對象和基礎流 |
2 | Dispose | 使所有緩沖數據寫入基礎流,釋放 StreamWriter 使用的非托管資源,同時還可以根據需要釋放受管理資源 |
3 | Flush | 清理當前寫入器的所有緩沖區,并使所有緩沖數據寫入基礎流 |
4 | Write | 清理當前寫入器的所有緩沖區,并使所有緩沖數據寫入基礎流 |
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());
}