文件讀寫操作
System.IO命名空間有著不同的類,用於執行各種文件操作
1.File 類
提供用於創建、複製、刪除、移動和打開單一文件的靜態方法。Flie的一些方法可以返回FileStream和StreamWriter對象
常用方法:
- Open(String path,FileMode mode) 以讀/寫 訪問權限打開指定路徑上的FileStream 參數 path 要打開的文件 mode 用於指定文件不存在時是否創建該文件,并確定保留還是覆蓋
- Create(String) 在指定路徑中創建或覆蓋文件
- Copy(String,String) 將現有文件複製到新文件,不允許覆蓋同名文件
- Delete(string path) 刪除指定文件
- Move(string sourceFileName,string destFileName) (要移動的文件的名稱,包括相對或絕對路徑,文件新路徑和名稱)
- SetAttributes(string path, FileAttributes fileAttributes) 設置文件屬性(只讀,隱藏)
- Exist(string path) 確定指定文件是否存在
讀寫:
- ReadAllLines(string,Encoding) 打開一個文件,使用指定的編碼讀取文件的所有行 (要打開以進行讀取的文件,應用到文件內容的編碼)
- ReadAllText(string,Encoding)打開一個文本文件,使用指定的編碼讀取文件的所有行
- WriteAllLines(string path,string[] contents) 創建一個新文件,在其中寫入指定的字節數組,然後關閉該文件 (要寫入的文件,要寫入的文件字符串數組)
- WriteAllText(string path,string contents)寫入指定字符串
namespace Filetest { class Filetest { static void Main(string[] args) { string path = @"D:\YGTfiletest\filetest.txt"; //文件路徑 try { using (FileStream fs = File.Create(path)) //使用using,定義範圍,在該範圍結束時回收資源,在指定路徑創建文件 { Byte[] info = new UTF8Encoding(true).GetBytes("This is some text in the file"); //轉換為字節,寫入數據 fs.Write(info, 0, info.Length); //字節數組,字節偏移量,最多寫入的字節數 } using (StreamReader sr = File.OpenText(path)) //打開文件 { string s = ""; while ((s = sr.ReadLine()) != null) //讀取文件內容 { Console.WriteLine(s); } } if (File.Exists(path)) //判斷文件是否存在 { string appendText = "添加內容" + Environment.NewLine; //Environment 是类,NewLine 是字符串属性,用于获取当前环境中定义的回车换行符字符串。相當於\r\n File.WriteAllText(path, appendText); //寫入指定字符串 string readText = File.ReadAllText(path); //打開文本文件,使用指定的編碼讀取文件的所有行 Console.WriteLine(readText); string[] createText = { "A", "B", "C" }; File.WriteAllLines(path, createText); //寫入文件的字符串數組 string readText2 = File.ReadAllText(path); Console.WriteLine(readText2); string[] readText3 = File.ReadAllLines(path); //讀取文件的所有行,返回包含文件所有行的字符串数组。 foreach (string s in readText3) { Console.WriteLine(s); } Console.ReadKey(); } } catch(Exception ex) { Console.WriteLine(ex.ToString()); } } } }
2. FileStream 文件流
文件流FileStream 類用於對文件流的操作,與File類單一操作文件方法不同的是,FileStream可以操作字節也就是可以保存任何類型的文件,解決內存問題(操作大的文件)
屬性:
- CanRead 判斷當前流是否支持讀取,返回bool值
- CanWrite 判斷當前流是否支持寫入,返回bool值
方法:
- Read() 從流中讀取數據,返回字節數組
- ReadByte() 從流中讀取一個字節,并將流內的位置向前提升一個字節
- Write() 將字節塊(字節數組)寫入該流
- WriteByte() 將一個字節寫入流內的當前位置,并將流內的位置向前提升一個字節
- Seek()設置文件讀取或寫入的起始位置
- Flush()清除該流緩衝區,使得所有緩衝的數據都被寫入到文件中
- Close()關閉當前流并釋放與之相關聯的所有系統資源
文件訪問方式(FileAccess)
- FileAccess.Read 對文件進行訪問
- FileAccess.Write 對文件進行寫操作
- FileAccess.ReadWrite 對文件進行讀或寫操作
文件打開模式(FileMode)
- FileMode.Append 打開現有文件向文件追加數據 ,只能與FileAccess.Write一起使用
- FileMode.Create 創建新文件,若存在,則覆蓋
- FileMode.CreateNew 創建新文件,若存在,則異常
- FileMode.OpenOrCreate 打開文件,若不在,則創建
- FlieMode.Truncate 打開文件,並且清空文件內容
namespace stream { class stream { static void Main(string[] args) { //創建FileStream對象,傳入參數文件路徑、打開模式、訪問方式 FileStream fsread = new FileStream(@"D:\YGTfiletest\filestream.txt",FileMode.OpenOrCreate,FileAccess.Read); //字節數組,大小為5M byte[] buffer = new byte[1024 * 1024 * 5]; //返回本次實際讀取到的字節數 int r = fsread.Read(buffer,0,buffer.Length); //Console.WriteLine(r); //Console.ReadKey(); //將buffer字節數組中每個元素解碼城字符串方式 string s = Encoding.Default.GetString(buffer,0,r); //釋放流 fsread.Close(); //釋放流所佔用資源 fsread.Dispose(); Console.WriteLine(s); using (FileStream fsWrite = new FileStream(@"D:\YGTfiletest\filestream.txt", FileMode.OpenOrCreate, FileAccess.Write)) { string str = "aaaa"; byte [] buffe = Encoding.Default.GetBytes(str); fsWrite.Write(buffe,0,buffe.Length); } Console.WriteLine("已寫入"); Console.ReadKey(); } } }
3.MemoryStream內存流(Read、ReadByte、Write 、WriteByte)
MemoryStream類表示的是保存在內存中的數據流,由內存流封裝的數據可以在內存中直接訪問,內存一般用於暫時緩存數據以降低應用程序對臨時緩衝區和臨時文件的需要
與文件流不同的是內存流中的數據以無符號字節數組的形式保存在內存中,系統可以直接訪問這些封裝的數據而不必讀取磁盤文件。讀取速度更快。
MemoryStream屬性:
- CanRead 獲取一個值,該值指示當前的流是否支持 讀取
- CanSeek 獲取一個值,該值指示當前流是否支持查找
- CanTimeout 是否支持超時
- CanWrite 是否支持寫入
- Capacity 獲取或設置分配給該流的字節數
- Length 獲取用字節表示的流的長度
- Position 獲取或設置流中的當前位置
MemoryStream 方法:
- BeginRead/EndRead 開始異步讀操作/等待掛起的異步讀取完成
- BeginWrite/EndWrite 開始異步寫操作/結束異步寫操作
- Read 從當前流中讀取字節塊并將數據寫入buffer中 (從當前流的position屬性的位置開始讀)
- ReadByte 讀取一個字節
- Seek 將當前流的長度設為指定值
- Write 使用從緩衝區讀取的數據將字節塊寫入當前流
- WriteByte 將一個字節寫入當前流中的當前位置
- WriteTo 將此內存流的整個內容寫入另一個流中(內存流向其他流轉換)
namespace ConsoleApplication1 { class MemoryStream1 { static void Main(string[] args) { MemoryStream ms = new MemoryStream(); byte[] buffer = Encoding.UTF8.GetBytes("ABCDEFG");//字節數組 ms.Write(buffer,0,7); //從緩沖區讀取數據寫入流中 byte[] result = ms.GetBuffer(); //返回寫入內存流的源流數據 string turnStr = Encoding.UTF8.GetString(result); //將字節數組轉換成字符串 Console.WriteLine(turnStr); ms.Seek(0,SeekOrigin.Begin);//將流的當前位置設置為開始的位置 int i = ms.ReadByte();//讀取一個字節,如果達到流的末尾則-1,返回字節的ASCII碼 Console.WriteLine("流的當前位置",i.ToString()); byte[] result1 = ms.ToArray();// 流返回一個字節數組,緩衝區,類似GetBuffer foreach(var item in result1) { Console.Write(item.ToString() + "-"); } MemoryStream ms2 = new MemoryStream(); byte[] buffer2 = Encoding.UTF8.GetBytes("漢字占三個字節"); ms2.Write(buffer2,0,buffer2.Length);//數據源,索引,長度 Console.WriteLine("\n"+ms2.Position);//position 可以理解為指針,寫完數據后在最後一位 int j = ms2.ReadByte();//索引position 在最後一位,所以返回的值為-1,表示在最後 Console.WriteLine("寫入數據后當前指針指向的值:{0}",j.ToString()); ms2.Position = 0; int k = ms2.ReadByte(); Console.WriteLine("改變指針后的值:{0}",k.ToString()); Console.ReadKey(); } } } 輸出結果 ABCDEFG 流的當前位置 65-66-67-68-69-70-71- 21 寫入數據后當前指針指向的值:-1 改變指針后的值:230
4. Stream Writer(Writer、 WriterLine)
用FileStream類需要許多額外的數據類型轉換工作,Stream Writer類允許直接將字符和字符串寫入文件,不必轉換為字節,一般不針對二進制數據
與創建FileStream對象不同,創建StreamWriter對象不會提供一組類似的選擇,沒有像FileStream那樣指定FileMode、FileAccess屬性,總是有對文件的讀寫權限。所以若要使用高級參數,先在FileStream構造函數中指定,然後創建StreamWrite
class Program { static void Main(string[] args) { FileStream aFile = new FileStream(@"D:\YGTfiletest\streamwriter.txt", FileMode.OpenOrCreate); StreamWriter sw = new StreamWriter(aFile); sw.WriteLine("換行"); //WriteLine()方法寫入傳遞給它的字符串,后跟有換行 sw.WriteLine("換行"); sw.Write("不會換行");//Write()方法只是把傳送給他的字符串寫入文件,不追加換行符 sw.Write("不會換行"); sw.Close(); } }
原文地址:https://www.cnblogs.com/ygtup/p/9359247.html