第5章 輸入與輸出
5.1概述
文件是計算機管理數據的基本單位,同時也是應用程序保存和讀取數據的一個重要場所。C#中文件處理技術稱爲I/O技術,即輸入與輸出技術,或稱爲流處理技術或文件流處理技術。
5.1.1 文件與流
文件和流既有區別又有聯繫。
文件是存儲在存儲介質上的數據集,是靜態的,具有名稱和相應路徑。當打開一個文件並對其進行讀寫時,該文件就成爲流。
文件是指在各種存儲介質上永久保存數據的有序集合,並與一個具體的名稱對應,它是進行文件讀寫操作的基本對象。從嚴格意義上講,文件指的是放在磁盤上的靜態信息,這種信息不是連續的,是隨機的。
流是文字序列的抽象概念,流提供一種向後續存儲器寫入字節或從後續存儲器讀取字節的方法。流一般指的是連續的字節信息。例如,要對一個文件進行處理,這個文件就會變成連續的字節信息加載到內存中,也就是說文件在處理時就必須變成流。流強調的是動態的連續信息,是由文件轉換成的。流和文件指的都是一件事物,但是狀態不一樣。
5.1.2 System.IO命名空間
System.IO命名空間包含允許 讀寫文件和數據流 的類型以及提供 基本文件和目錄 支持的類型,因此在使用這些類時需要引入System.IO命名空間。
表1 System.IO命名空間中常用類
類名 |
功能和用途 |
Directory、DirectoryInfo |
創建、刪除並移動目錄,通過屬性獲取特定目錄的相關信息 |
File、FileInfo |
創建、刪除並移動文件,通過屬性獲取特定文件的相關信息 |
StreamReader、StreamWriter |
讀寫文本數據信息 |
BinaryReader、BinaryWriter |
讀寫二進制數據 |
System.IO命名空間中的常用類大致分爲 操作目錄的類、操作文件的類、文件讀寫類等。
其中,Directory類和DirectoryInfo類屬於操作目錄的類;File類和FileInfo類屬於操作文件的類;treamReader類和StreamWriter類屬於文本文件讀寫的類;BinaryReader類和BinaryWriter類屬於二進制文件讀寫的類。
5.2 目錄操作
對文件目錄進行操作,如創建目錄、刪除目錄等,爲此C#提供了Directory類和DirectoryInfo類。
5.2.1 Directory類
Directory類是靜態類,提供了許多靜態方法用於對目錄進行操作,如創建、刪除和移動目錄等。
表1 Directory類的一些常用方法
方法 |
說明 |
CreateDirectory() |
創建指定路徑的目錄 |
Exists() |
判斷目錄是否存在 |
GetDirectoryRoot() |
獲取指定目錄的根目錄 |
GetDirectories() |
獲取當前目錄下的Directory對象數組 |
GetFiles() |
獲取當前目錄下的File對象數組 |
Delete() |
刪除指定目錄及其目錄下的所有文件 |
Move() |
將指定目錄移動到新的位置 |
注意:Directory的Delete()方法是永久刪除的,不是把目錄送回回收站;
使用Move()方法移動目錄時,要注意不能跨磁盤移動,如C盤的文件不能移動到D盤下。
代碼實例
需求:目錄創建程序
設計:…
運行結果和代碼:
- .2.2 DirectoryInfo類
DirectoryInfo類的功能與Directory類相似,不同的是DirectoryInfo類是一個實例類,所有方法都是實例方法。即 使用DirectoryInfo類提供的方法必須實例化一個屬於DirectoryInfo類的對象。因此,若需要對同一個目錄進行多次重複操作時,應該考慮使用DirectoryInfo類的實例方法。
表2 DirectoryInfo類的一些常用屬性
屬性 |
說明 |
Name |
獲取當前DirectoryInfo對象的名稱 |
Root |
獲取當前路徑的根目錄 |
Parent |
獲取指定子目錄的父目錄 |
FullName |
獲取目錄或文件的完整目錄 |
Exists |
判斷指定目錄是否存在 |
代碼實例
需求:目錄瀏覽程序
設計:…
運行結果和代碼:
5.3 文件操作
File類和FileInfo類主要提供與文件有關的各種操作,包括創建、複製、移動、刪除文件等。
- 3.1 File類
File類是一個靜態類,提供了許多靜態方法,用於處理文件。
表1 File類的常用方法
方法 |
說明 |
Create() |
創建文件 |
Open() |
打開指定路徑上的文件,返回FileStream對象 |
Copy() |
將文件複製到指定位置 |
Move() |
將指定文件移動到新位置 |
Delete() |
刪除文件 |
Exists() |
判斷指定文件是否存在 |
注意:Directory和File提供的方法都是共享方法,如果執行一次操作,使用共享方法的效率較高;但如果針對一個目錄或文件多次操作,可以考慮使用DirectoryInfo和FileInfo提供的實例方法。
代碼實例
需求:文件刪除程序
設計:…
運行結果和代碼:
5.3.2 FileInfo類
FileInfo類與File類相似,它們都可以對磁盤上的文件進行操作。不同的是FileInfo類是實力類,所有的方法必須實例化對象後才能調用。FileInfo類除了擁有與File類相似的方法外,同時也有它特有的屬性。
表2 FileInfo類的常用屬性
屬性 |
說明 |
Directory |
獲取父目錄的實例 |
DirectoryName |
獲取表示目錄的完整路徑的字符串 |
FullName |
獲取目錄或文件的完整目錄 |
Lengeth |
獲取當前文件的大小 |
代碼實例
需求:文件瀏覽程序
設計:…
運行結果和代碼:
5.4 讀寫文本文件
數據流(也稱流)是一個用於傳輸數據的對象。數據的傳輸有兩個方向,如果數據是從外部源傳輸到程序中,就稱爲讀取流;如果數據是從程序傳輸到外部源,就成爲寫入流。
在System.IO 命名空間中,對文件的讀寫操作是依靠流操作進行的。也就是說.NET中一個被打開的文件就是一個數據流,對已經打開的文件進行讀寫操作就是對內存中的一個數據流進行讀寫操作。
- 4.1 讀寫文本文件
文本文件時一種純文本數據構成的文件。實際上,文本文件只保存了字符的編碼。.NET Framework支持多種編碼,包括ASCII、UTF7、UTF8、Unicode、UTF32等。在.NET Framework中,讀寫文本文件可以使用流讀取器StreamReader和流寫入器StreamWriter。
1) StreamReader類
用於從文件中讀取數據,該類是一個通用類,可用於任何流。StreamReader類以一種特定的編碼輸入字符,默認的編碼爲UTF8,UTF8可以正確處理Unicode字符並在操作系統的本地化版本上提供一致的結果。
表1 StreamReader類的常用方法
方法 |
說明 |
Close() |
關閉StreamReader對象和基礎流 |
Dispose() |
釋放所有StreamReader對象資源 |
Peek() |
返回下一個可用的字符 |
Read() |
讀取輸入流中的下一個字符或下一組字符 |
ReadLine() |
從數據流中讀取一行數據,並作爲字符串返回 |
ReadToEnd() |
從流的當前位置到末尾讀取流 |
2) StreamWriter類
StreamWriter類用於將字符和字符串寫入文件,它實際上也是先轉換成FileStream對象,然後向文件中寫入數據的,所以在創建對象時可以通過FileStream對象來創建StreamWriter對象,同時也可以直接創建StreamWriter對象。StreamWriter默認使用UTF8編碼。
表2 StreamWriter類的常用方法
方法 |
說明 |
Close() |
關閉StreamWriter對象和基礎流 |
Dispose() |
釋放所有StreamWriter對象資源 |
Flush |
清理當前編寫器的所有緩存區,並使所有緩衝數據寫入基礎流 |
Write() |
寫入流 |
WriteLine() |
寫入指定的某些數據,後跟行結束符 |
代碼實例
需求:簡單日誌程序
設計:…
運行結果和代碼:
5.4.2 讀寫二進制文件
在.NET Framework中,讀寫二進制文件可以使用流讀取器BinaryReader和流寫入器BinaryWriter。二進制文件是以二進制代碼形式存儲的文件,數據存儲爲字節序列。二進制文件可以包含圖像、聲音、文本或編譯之後的程序代碼。
C#的FileStream類提供了最原始的字節級上的文件讀寫功能,但編程中經常會對字符串操作,於是StreamWriter類和StreamReader類增強了FileStream類,它可以在字符串級別上操作文件。但有時還是需要在字節級上操作文件。卻又不是一個一個字節地操作,通常是2個、4個或8個字節操作,這便有了BinaryWriter和BinaryReader類,它們可以將一個字符或數字按指定個數字節寫入,也可以一次讀取指定字節轉爲字符或數字。
- BinaryReader類
BinaryReader類用特定的編碼將基元數據類型 讀作 二進制值
方法 |
說明 |
Close() |
關閉BinaryReader對象和基礎流 |
Dispose() |
釋放BinaryReader類當前實例所使用的所有資源 |
PeekChar() |
返回下一個可用的字符,並且不提升字節或字符的位置 |
Read() |
從基礎流中讀取字符,並根據所使用的Encoding和從流中讀取的特定字符,提升流的當前位置 |
ReadByte() |
從當前流中讀取下一個字節,並使流的當前位置提升一個字節 |
ReadString() |
從當前流中讀取一個字符串。字符串有長度前綴,一次7位地被編碼爲整數。 |
2) BinaryWriter類
BinaryWriter類以二進制形式將基元類型 寫入 流,並支持用特定的編碼寫入字符串。
方法 |
說明 |
Close() |
關閉當前BinaryWriter和基礎流 |
Dispose() |
釋放BinaryWriter類當前實例所使用的所有資源 |
ToString() |
返回表示當前對象的字符串 |
Write() |
將值寫入當前流 |
代碼實例
需求:簡單學生管理程序
設計:…
運行結果和代碼: