c#基礎語言編程-文件流操作

引言

在System.IO 命名空間下提供了一系列的類,我們可以通過相應的類進行文件、目錄、數據流的操作。
1、File類:提供用於創建、複製、刪除、移動和打開文件的靜態方法。File類
2、FileInfo類:提供創建、複製、刪除、移動和打開文件的屬性和實例方法。FileInfo類
3、FileStream類:主要用於讀取磁盤上的文件或者向磁盤文件寫入信息。有時,我們需要將程序中的一些數據存儲到磁盤上或是讀取配置文件中某些內容,在這裏我們就會用該類。
4、MemoryStream類: 主要用於操作內存中的數據。比如說網絡中傳輸數據時可以用流的形式,當我們收到這些流數據時就可以聲明MemoryStream類來存儲並且處理它們。
5、BufferedStream類:主要也是用來處理流數據的,但是該類主要的功能是用來封裝其他流類。爲什麼要封裝其他流類,這麼做的意義是什麼?按照微軟的話說主要是減少某些流直接操作存儲設備的時間。對於一些流來說直接向磁盤中存儲數據這種做法的效率並不高,用BufferedStream包裝過的流,先在內存中進行統一的處理再向磁盤中寫入數據,也會提高寫入的效率。
6、 NetworkStream類:主要是專門用來處理服務器與客戶端通信的流。它在網絡編程中經常使用,主要是用來處理類似Socket、TcpClient和TcpListener這些類中得到的流。
7、StreamReader/StreamWriter類:主要用來處理流數據。它們分別提供了高效的流讀取/寫入功能。
8、TextReader/TextWriter類:主要用來處理流數據。它們分別提供了高效的文本流讀取/寫入功能。

Stream類,TextReader類,TextWriter類,BinaryReader類,BinaryWriter類都繼承了IDisposable接口,所以使用後必須關閉流。把流中數據加載到內存時要考慮內存溢出等問題Stream類,TextReader類,TextWriter類都爲抽象類。

File類

提供用於創建、複製、刪除、移動和打開文件的靜態方法,並協助創建 FileStream 對象。重要點在於協助創建FileStream對象,從而進行一下操作,所以File類的應用重點在創建、刪除、打開等操作。
重點方法:
File.Exists 確定文件是否存在,經常用的。
File.Create 指定路徑創建文件,這方法應用很少。
File.move 將指定文件移到新位置,並提供指定新文件名的選項。
File.OpenRead 打開現有文件以進行讀取。返回FileStream 比較常用,可以應用比較廣泛的流。
File.OpenWrite 打開現有文件以進行寫入.
File.OpenText 打開現有 UTF-8 編碼文本文件以進行讀取。這個在寫日誌時,應用比較廣泛。
File.AppendText 創建一個 StreamWriter,它將 UTF-8 編碼文本追加到現有文件。這個也比較常用,以供日誌隨時讀取和寫入。

 //1.判斷一個文件是否存在

 if (!File.Exists(@"c:\hello.txt"))
  {
      File.Create(@"c:\hello.txt");
  }
////2.拷貝一個文件
    File.Copy(@"c:\hello.txt", @"d:\hello.txt");
//File.Move(); 移動,剪切文件
 //4.刪除一個文件
//文件的刪除,即便文件不存在也不會報異常
   File.Delete(@"c:\abc.txt");
  //5.讀取一個文件,寫入
File.WriteAllText(@"c:\xxx.txt", "你好China !");

FileStream類

使用 FileStream 類對文件系統上的文件進行讀取、寫入、打開和關閉操作,並對其他與文件相關的操作系統句柄進行操作,如管道、標準輸入和標準輸出。讀寫操作可以指定爲同步或異步操作。FileStream 對輸入輸出進行緩衝,從而提高性能。
請確保對所有 FileStream 對象調用 Dispose 方法,特別是在磁盤空間有限的環境中。如果沒有可用的磁盤空間並且在終止 FileStream 之前沒有調用 Dispose 方法,則執行 IO 操作會引發異常。
file 類是實用工具類,所帶靜態方法主要用於根據文件路徑和標準輸入、標準輸出以及標準錯誤設備創建 FileStream 對象。MemoryStream 類通過字節數組創建流,而且功能與 FileStream 類似。

  • FileStream文件流的使用方式。
    一、創建一個文件流
    二、讀文件或者寫文件
    三、關閉文件流
    四、釋放相關資源
 ////1.創建一個    中國.txt
    string txt = "中國是四大文明古國之一";
  //一、創建一個文件流
  FileStream fs = new FileStream(@"c:\中國.txt", FileMode.Create, FileAccess.Write);
  byte[] buffer = Encoding.UTF8.GetBytes(txt);
 //二、讀文件或者寫文件
//參數1:表示要把哪個byte[]數組中的內容寫入到文件
  //參數2:表示要從該byte[]數組的第幾個下標開始寫入,一般都是0
  //參數3:要寫入的字節的個數。
fs.Write(buffer, 0, buffer.Length);
//三、關閉文件流
 //清空緩衝區
  fs.Flush();
fs.Close();
//四、釋放相關資源
 fs.Dispose();

針對釋放資源,一般使用Using

using (FileStream fs = new FileStream(@"c:\中國.txt", FileMode.Create, FileAccess.Write))
  {
 byte[] buffer = Encoding.UTF8.GetBytes(txt);
//二、讀文件或者寫文件fs.Write(buffer, 0, buffer.Length);
  }

這樣就ok了。
利用FIleStream進行文件複製操作

 //1.創建一個讀取源文件的文件流
using (FileStream fsRead = new FileStream(source, FileMode.Open, FileAccess.Read))
  {
   //2.創建一個寫入新文件的文件流
     using (FileStream fsWrite = new FileStream(target, FileMode.Create, FileAccess.Write))
   {
   //創建緩衝區
   byte[] buffer = new byte[1024 * 1024 * 5];
    //3.通過fsRead讀取源文件,然後再通過fsWrite寫入新文件
//通過文件流讀取
//返回值:表示本次實際讀取到的字節個數。
int byteCount = fsRead.Read(buffer, 0, buffer.Length);
 while (byteCount > 0)
    {
    //把剛剛讀取到的內容寫入到新文件流中
    fsWrite.Write(buffer, 0,byteCount);
   //需要循環執行讀寫操作
   //把上次讀取到內容寫入完畢後,繼續再讀取,這裏會自動定位。
   byteCount = fsRead.Read(buffer, 0, buffer.Length);
  //fsRead.Position
  //fsWrite.Position
   Console.Write(". ");
      }
   }
}

用filestream從文件中讀取文件。是通過指定文件大小讀取文件。如果在操作過程中,讀取一部分顯示一部分時,加入獲取的byte數組的大小有錯誤,可能導致文件顯示不正確。所以在文件讀取顯示操作時不能用filestream。專門針對文件操作的文件流。

StreamReader/StreamWriter類

StreamReader/StreamWriter主要用來處理流數據。它們分別提供了高效的流讀取/寫入功能。

StreamReader/Writer讀寫
StreamReader reader = new StreamReader("filePath");//初始化讀取
StreamWriter writer = new StreamWriter("filePath");//初始化寫入
//或者,如果沒有就會創建文件,不會報錯
StreamWriter writer = File.AppendText("Filepath");

string readStr=reader.ReadLine();//從流中讀取一行
//2.循環讀取每一行數據。
string line = null;
//int count = 0;
while ((line = reader.ReadLine()) != null)
{
 //count++;
 Console.WriteLine(line);
 }
string readAff = reader.ReadToEnd();//從流中讀取全部

writer.Write("Hi 你好");//寫入內容
writer.WriteLine("Hi 你好");//寫入一行

reader.Close();//關閉流
writer.Close();

其他流

MemoryStream類主要用於操作內存中的數據。比如說網絡中傳輸數據時可以用流的形式,當我們收到這些流數據時就可以聲明MemoryStream類來存儲並且處理它們。讀取圖片數據可以用


string str = "Hi!你好!";
byte[] array = Encoding.UTF8.GetBytes(str);//將字符串轉化爲字節數組
MemoryStream memory = new MemoryStream(array);//初始化MemoryStream類
byte[] arrayNew = memory.ToArray();//將內存中的數據轉換爲字節數組
string strNew = Encoding.UTF8.GetString(arrayNew);//將字節數組轉換爲字符串

BufferedStream類主要也是用來處理流數據的,但是該類主要的功能是用來封裝其他流類。爲什麼要封裝其他流類,這麼做的意義是什麼?按照微軟的話說主要是減少某些流直接操作存儲設備的時間。對於一些流來說直接向磁盤中存儲數據這種做法的效率並不高,用BufferedStream包裝過的流,先在內存中進行統一的處理再向磁盤中寫入數據,也會提高寫入的效率。
NetWorkStream類是專門用來處理服務器與客戶端通信的流。它在網絡編程中經常使用,主要是用來處理類似Socket、TcpClient和TcpListener這些類中得到的流。

//服務器
TcpListener lis=new TcpListener(5000); //服務器監聽
lis.Start();//啓動
Socket sock=lis.AcceptSocket();//阻塞,直到有客戶端連接

NetworkStream networkStream = new NetworkStream(sock);//得到Socket中的流
if (netStream.DataAvailable)   //如果客戶端發送了消息
{
   byte[] data = new byte[1024];   //定義一個字節數組,用來存放接收的數據
   int len = netStream.Read(data, 0, data.Length);  //從位置開始,讀取到字節數組末尾
   string line = Encoding.Default.GetString(data, 0, len);  //把收到的字節轉換爲字符串
}
//客戶端
TcpClient client = new TcpClient();//客戶端tcp對象
client.Connect("127.0.0.1", 5000);//連接服務器
NetworkStream myStream = client.GetStream();//得到網絡流

byte[] data = Encoding.Default.GetBytes("Hi,你好");  //首先把輸入的字符串消息轉換爲字節
myStream .Write(data, 0, data.Length);  //向myStream 裏寫入數據
myStream .Flush();  //刷新流中的數據
myStream .Close();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章