---------------------
文轉載自:CSDN 作者:未來無限
原文地址:https://blog.csdn.net/qq_30725967/article/details/90107692
一、流的定義
現在處理文件使用強大的選項:流。流是一個用於傳輸數據的對象。
讀取流:數據從外部源傳輸到程序中。
寫入流:數據從程序中傳輸到外部源中。
外部源常常是一個文件,但不完全都是文件,可以是:
1)使用一些網絡協議讀寫網絡上的數據,或是從另一個計算機上發送數據;
2)讀寫到命名管道上;
3)把數據讀寫到一個內存區域上;
二、常用的文件讀寫類
1)FileStream (文件流) 主要用於在二進制文件中讀取二進制數據
2)StreamReader (流讀取器)和StreamWriter (流寫入器) 專門用於讀取文本格式的流產品
3)BinaryReader和BinaryWriter 專門讀寫二進制格式的流產品
二、使用文件流類
1)FileStream
A、FileStream構造
構造FileStream實例,需要以下信息
1:要訪問的文件
2:如何打開文件的模式。如新建一個文件或打開一個現有的文件。如果打開一個現有的文件,寫入操作是覆蓋文件原來的內容,還是追加到文件的末尾
3:訪問文件的方式 只讀、只寫還是讀寫
4:共享訪問 表示是否獨占訪問文件。如果允許其他流同時訪問文件,則這些流是只讀、只寫還是讀寫文件。
第一信息通常用一個包含文件的完整路徑名的字符串來表示,其他三個信息分別由3個.net枚舉 FileMode,FileAccess,FileShare來表示。
1.枚舉類FileMode
指定操作系統打開文件的方式
CreateNew 指定操作系統應創建一個新的文件
Create 指定操作系統應創建一個新的文件。 如果該文件已存在,則會覆蓋它
Open 指定操作系統應打開現有文件
OpenOrCreate 指定操作系統應打開一個文件,是否它存在,則否則,應創建一個新的文件
Truncate 指定操作系統應打開現有文件。 當打開文件時,應被截斷,以便其大小為零字節
Append 如果它存在,並且查找到該文件的末尾,或者創建一個新文件,請打開該文件
2.枚舉類FileAccess
對於讀、 寫或讀/寫訪問的文件中定義的常數
Read 對文件的讀取訪問權限。 可以從文件讀取數據
Write 對文件的寫入訪問權限。 數據可以寫入該文件
ReadWrite 讀取和寫入到文件的訪問。 可以寫入和從文件中讀取數據
3.枚舉類FileShare
包含用於控制的訪問其他類型的常數 System.IO.FileStream 對象可以具有相同的文件
None 拒絕共享當前文件。 在關閉文件之前,任何請求打開的文件 (此進程或另一個進程) 將失敗
Read 允許以后打開文件進行讀取
Write 允許以后打開文件進行寫入
ReadWrite 允許以后打開的文件進行讀取或寫入
Delete 允許以后刪除文件
Inheritable 使文件句柄由子進程繼承。 這是不直接支持 Win32
常用構造形式:
FileStream(String 文件路徑,FileMode 文件打開模式)
FileStream(String 文件路徑,FileMode 文件打開模式,FileAccess 文件訪問方式)
FileStream(String 文件路徑,FileMode 文件打開模式,FileAccess 文件訪問方式,FileShare 文件共享方式)
實例:
FileStream fileStream = new FileStream(@“D:\file.txt”,FileMode.Open,FileAccess.Read,FileShare.Read);
FileStream有很多構造函數,上面的帶4個參數。
B、FileStream常用屬性
CanRead 判斷當前流是否支持讀取,返回bool值,True表示可以讀取
CanWrite 判斷當前流是否支持寫入,返回bool值,True表示可以寫入
Position 獲取或設置此流的當前位置
B、FileStream常用方法
Read() 從流中讀取數據,返回字節數組
Write() 將字節塊(字節數組)寫入該流
Seek() 設置文件讀取或寫入的起始位置
Flush() 清除該流緩沖區,使得所有緩沖的數據都被寫入到文件中
Close() 關閉當前流並釋放與之相關聯的所有系統資源
2)StreamReader
StreamReader 類用於從流中讀取字符串。它繼承自 TextReader 類。
A、StreamReader構造
StreamReader 類的構造方法有很多,這里介紹一些常用的構造方法。
構造方法
StreamReader(Stream stream) 為指定的流創建 StreamReader 類的實例
StreamReader(string path) 為指定路徑的文件創建 StreamReader 類的實例
StreamReader(Stream stream, Encoding encoding) 用指定的字符編碼為指定的流初始化 StreamReader 類的一個新實例
StreamReader(string path, Encoding encoding) 用指定的字符編碼為指定的文件名初始化 StreamReader 類的一個新實例
B、StreamReader屬性
Encoding CurrentEncoding 只讀屬性,獲取當前流中使用的編碼方式
bool EndOfStream 只讀屬性,獲取當前的流位置是否在流結尾
C、StreamReader方法
void Close() 關閉流
int Peek() 獲取流中的下一個字符的整數,如果沒有獲取到字符, 則返回 -1
int Read() 獲取流中的下一個字符的整數
int Read(char[] buffer, int index, int count) 從指定的索引位置開始將來自當前流的指定的最多字符讀到緩沖區
string ReadLine() 從當前流中讀取一行字符並將數據作為字符串返回
string ReadToEnd() 讀取來自流的當前位置到結尾的所有字符
D,實例
class Program { static void Main(string[] args) { //定義文件路徑 string path = @"D:\\code\\test.txt"; //創建 StreamReader 類的實例 StreamReader streamReader = new StreamReader(path); //判斷文件中是否有字符 while (streamReader.Peek() != -1) { //讀取文件中的一行字符 string str = streamReader.ReadLine(); Console.WriteLine(str); } streamReader.Close(); } }
3)StreamWriter
StreamWriter 類主要用於向流中寫入數據。
A、StreamWriter構造
StreamWriter(Stream stream) 為指定的流創建 StreamWriter 類的實例
StreamWriter(string path) 為指定路徑的文件創建 StreamWriter 類的實例
StreamWriter(Stream stream, Encoding encoding) 用指定的字符編碼為指定的流初始化 StreamWriter 類的一個新實例
StreamWriter(string path, Encoding encoding) 用指定的字符編碼為指定的文件名初始化 StreamWriter 類的一個新實例
B、StreamWriter屬性
bool AutoFlush 屬性,獲取或設置是否自動刷新緩沖區
Encoding Encoding 只讀屬性,獲取當前流中的編碼方式
C、StreamWriter方法
void Close() 關閉流
void Flush() 刷新緩沖區
void Write(char value) 將字符寫入流中
void WriteLine(char value) 將字符換行寫入流中
Task WriteAsync(char value) 將字符異步寫入流中
Task WriteLineAsync(char value) 將字符異步換行寫入流中
D、實例
class Program { static void Main(string[] args) { string path = @"D:\\code\\test.txt"; //創建StreamWriter 類的實例 StreamWriter streamWriter = new StreamWriter(path); //向文件中寫入姓名 streamWriter.WriteLine("小張"); //向文件中寫入手機號 streamWriter.WriteLine("13112345678"); //刷新緩存 streamWriter.Flush(); //關閉流 streamWriter.Close(); } }
4)BinaryReader
BinaryReader 類中提供的構造方法有 3 種,具體的語法形式如下。
第1種形式:
BinaryReader(Stream input) //其中,input 參數是輸入流。
第2種形式:
BinaryReader(Stream input, Encoding encoding) //其中,input 是指輸入流,encoding 是指編碼方式。
第3種形式:
BinaryReader(Stream input, Encoding encoding, bool leaveOpen) //其中,input 是指輸入流,encoding 是指編碼方式,leaveOpen 是指在流讀取后是否包括流的打開狀態。
下面分別使用不同的構造方法創建 BinaryReader 類的實例,代碼如下。
BinaryReader 類中提供的構造方法有 3 種,具體的語法形式如下。 第1種形式: BinaryReader(Stream input) //其中,input 參數是輸入流。 第2種形式: BinaryReader(Stream input, Encoding encoding) //其中,input 是指輸入流,encoding 是指編碼方式。 第3種形式: BinaryReader(Stream input, Encoding encoding, bool leaveOpen) //其中,input 是指輸入流,encoding 是指編碼方式,leaveOpen 是指在流讀取后是否包括流的打開狀態。
屬性和方法:
int Read() 從指定的流中讀取字符
int Read(byte[] buffer, int index, int count) 以 index 為字節數組中的起始點,從流中讀取 count 個字節
int Read(char[] buffer, int index, int count) 以 index 為字符數組的起始點,從流中讀取 count 個字符
bool ReadBoolean() 從當前流中讀取 Boolean 值,並使該流的當前位置提升 1 個字節
byte ReadByte() 從當前流中讀取下一個字節,並使流的當前位置提升 1 個字節
byte[] ReadBytes(int count) 從當前流中讀取指定的字節數寫入字節數組中,並將當前 位置前移相應的字節數
char ReadChar() 從當前流中讀取下一個字符,並根據所使用的 Encoding 和從流中讀取的特定字符提升流的當前位置
char[] ReadChars(int count) 從當前流中讀取指定的字符數,並以字符數組的形式返回 數據,然后根據所使用的 Encoding 和從流中讀取的特定字符將當前位置前移
decimal ReadDecimal() 從當前流中讀取十進制數值,並將該流的當前位置提升 16 個字節
double ReadDouble() 從當前流中讀取 8 字節浮點值,並使流的當前位置提升 8 個字節
short ReadInt16() 從當前流中讀取 2 字節有符號整數,並使流的當前位置提升 2 個字節
int ReadInt32() 從當前流中讀取 4 字節有符號整數,並使流的當前位置提升 4 個字節
long ReadInt64() 從當前流中讀取 8 字節有符號整數,並使流的當前位置提升 8 個字節
sbyte ReadSByte() 從該流中讀取 1 個有符號字節,並使流的當前位置提升 1 個字節
float ReadSingle() 從當前流中讀取 4 字節浮點值,並使流的當前位置提升 4 個字節
string ReadString() 從當前流中讀取一個字符串。字符串有長度前綴,一次 7 位地被編碼為整數
ushort ReadUInt16() 從該流中讀取的 2 字節無符號整數
uint ReadUInt32() 從該流中讀取的 4 字節無符號整數
ulong ReadUInt64() 從該流中讀取的 8 字節無符號整數
void FillBuffer(int numBytes) 用從流中讀取的指定字節數填充內部緩沖區
實例:
class Program { static void Main(string[] args) { FileStream fileStream = new FileStream(@"D:\\code\\test.txt", FileMode.Open); BinaryReader binaryReader = new BinaryReader(fileStream); //讀取文件的一個字符 int a = binaryReader.Read(); //判斷文件中是否含有字符,若不含字符,a 的值為 -1 while(a!= -1) { //輸出讀取到的字符 Console.Write((char)a); a = binaryReader.Read(); } } }
5)BinaryWriter
第1種形式:
BinaryWriter(Stream output)
第2種形式:
BinaryWriter(Stream output, Encoding encoding)
第3種形式:
BinaryWriter(Stream output, Encoding encoding, bool leaveOpen)
屬性和方法:
void Close() 關閉流
void Flush() 清理當前編寫器的所有緩沖區,使所有緩沖數據寫入基礎設備
long Seek(int offset, SeekOrigin origin) 返回查找的當前流的位置
void Write(char[] chars) 將字符數組寫入當前流
Write7BitEncodedInt(int value) 以壓縮格式寫出 32 位整數
實例:
class Program { static void Main(string[] args) { FileStream fileStream = new FileStream(@"D:\\code\\test.txt", FileMode.Open, FileAccess.Write); //創建二進制寫入流的實例 BinaryWriter binaryWriter = new BinaryWriter(fileStream); //向文件中寫入圖書名稱 binaryWriter.Write("C#基礎教程"); //向文件中寫入圖書價格 binaryWriter.Write(49.5); //清除緩沖區的內容,將緩沖區中的內容寫入到文件中 binaryWriter.Flush(); //關閉二進制流 binaryWriter.Close(); //關閉文件流 fileStream.Close(); fileStream = new FileStream(@"D:\\code\\test.txt", FileMode.Open, FileAccess.Read); //創建二進制讀取流的實例 BinaryReader binaryReader = new BinaryReader(fileStream); //輸出圖書名稱 Console.WriteLine(binaryReader.ReadString()); //輸出圖書價格 Console.WriteLine(binaryReader.ReadDouble()); //關閉二進制讀取流 binaryReader.Close(); //關閉文件流 fileStream.Close(); } }
原文:https://blog.csdn.net/qq_30725967/article/details/90107692