大家新年快樂吖 (¯▽¯;)
這是一個包含所有代碼的樣本 可直接運行,主要包含了檔案讀寫時位元據流和字元資料的處理
並且我都寫了很詳細的注釋 方便大家也方便自己學習
:
using System;using System.Net.NetworkInformation;using System.Text;using System.IO;namespace ConsoleApplication1{ class Program { static void Main(string[] args) { binaryWriteRead(); //copy(); //Console.WriteLine("複製完成"); //txtRead(); } //二進位讀寫綜合應用(適合搞啥子序列化啊遊戲資料儲存之類的) //注意本執行個體裡的記憶體變化位元組數等 static void binaryWriteRead() { //寫入磁碟(在記憶體中是output 因為是輸出到外部裝置 ) //作業系統中stream是以記憶體為參照的 FileStream fs = File.Create("儲存"); System.IO.BinaryWriter writer = new BinaryWriter(fs); Random rdm = new Random(); for (int i = 0; i < 10; i++)//int32 4位元組X10 { int num = rdm.Next(); writer.Write(num); Console.WriteLine("寫入整數:{0}", num); } char[] data = { 'h', 'e', 'l', 'l', 'o' }; writer.Write(data); Console.WriteLine("寫入:hello"); writer.Write('-');//46位元組 //寫入26個字母的ascii碼 //如果讀取的時候使用的是streamReader 則讀取的是對應ascii的字母 for (byte i = 97; i < 97 + 26; i++) writer.Write(i); Console.WriteLine("寫入字母a~z"); writer.Write('\n');//71位元組 Console.WriteLine("------------------------------------------"); fs.Flush(); fs.Close(); writer.Close(); //------------------------------------------------------------- //讀取(在記憶體中是input) fs = File.OpenRead("儲存"); BinaryReader reader = new BinaryReader(fs); //讀取26個字母 fs.Seek(46, SeekOrigin.Begin); for (byte i = 97; i < 97 + 26; i++) Console.Write(reader.ReadChar()); //讀取10個整數 fs.Seek(-72, SeekOrigin.Current); Console.WriteLine(); //int 代表 System.Int32 4個位元組 //如果writer.Write(true) 實際上也是寫入一個位元組:0x0001 //位元組是基本單位 byte[] numData = new byte[4]; for (int i = 0; i < 10; i++) { reader.Read(numData, 0, 4); Console.WriteLine("讀取整數:{0}", byteArToLong(numData));//手工對byte數組進行轉換 //Console.WriteLine("讀取整數:{0}", reader.ReadInt32()); } reader.Close(); fs.Close(); } static int getNum(byte[] bytes)//二進位轉十進位(我文章裡留言那位兄弟滴代碼很牛x ^_^) { //long型資料類型為8位元組 int num = 0; int n = Math.Min(bytes.Length, 4) - 1; for (int i = n; i > -1; i--) num = (num << 8) | bytes[i];//num = (num<<8) + bytes[i]; return num; } //位元組數組轉長整型(二進位轉十進位) static long byteArToLong(byte[] bytes) { //int [] nums= {1,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144}; //當時My Code是這樣寫的哈遇到大的數字就要出問題,一個位元組8位應該是8的平方 而我寫的確是2的平方 //不過上面那位留言的高手只顧自己開心了這麼明顯的錯誤也沒看出來 //int srcData = 312705998; //比如上面的int值在記憶體中是0x12a383ce 的形式儲存的 //但是他在檔案中儲存確是反過來的(低位在前 高位在後) //如果我一次讀取4位元組就是下面的形式 //byte []data = {0xce,0x83,0xa3,0x12}; int[] nums = { 1, 256, 65536, 16777216 }; if (bytes.Length > nums.Length) throw new Exception("溢出"); long num = 0; for (int i = 0; i < bytes.Length; i++) num += (bytes[i] * nums[i]); return num; } static void copy()//檔案拷貝(二進位讀寫) { FileStream fs = File.OpenRead("d:/建立檔案夾 (2).zip"); FileInfo copys = new FileInfo("d:/複件.zip"); FileStream fsCopy = copys.Create(); byte[] data = new byte[10]; int reds; while ((reds = fs.Read(data, 0, data.Length)) > 0) fsCopy.Write(data, 0, reds); fs.Flush(); fsCopy.Close(); fs.Close(); } static void txtRead()//文本讀取 { //ANSI編碼是個很蛋疼的東西 //比如utf-8還有其他編碼儲存的文字檔最開始會有兩個位元組用來識別編碼的 //而ANSI沒有 但是ANSI是經過擴了展的有漢字編碼 //以前曾試過自己直接通過讀取二進位再解碼的方式來做 但是真滴很麻煩 //還是這樣比較方便 偷懶 O(∩_∩)O哈哈~ FileStream fs = File.Open(@"d:/a.cs", FileMode.Open); StreamReader reader = new StreamReader(fs); string data; while ((data = reader.ReadLine()) != null) Console.WriteLine(data); } }}