[转载]C#流,字节数组,字符串
下面將用到的一些簡單的轉換操作貼上來,方便記憶?
流:二進制
字節:無符號整數
字符:Unicode編碼字符
字符串:多個Unicode編碼字符
?
那么在.net下它們之間如何轉化呢?
一般是遵守以下規則:
流->字節數組->字符數組->字符串
?
下面就來具體談談轉化的語法
流->字節數組
MemoryStream ms = new MemoryStream(); byte[] buffer = new byte[ms.Length]; ms.Read(buffer, 0, (int)ms.Length);字節數組->流
byte[] buffer = new byte[10]; MemoryStream ms = new MemoryStream(buffer);字節數組->字符數組
1.
byte[] buffer = new byte[10]; char[] ch = new ASCIIEncoding().GetChars(buffer); //或者:char[] ch = Encoding.UTF8.GetChars(buffer) 2. byte[] buffer = new byte[10]; char[] ch = new char[10]; for(int i=0; i<buffer.Length; i++) {ch[i] = Convert.ToChar(buffer[i]); }字符數組->字節數組
1. char[] ch = new char[10]; byte[] buffer = new ASCIIEncoding().GetBytes(ch); //或者:byte[] buffer = Encoding.UTF8.GetBytes(ch) 2. char[] ch = new char[10]; byte[] buffer = new byte[10]; for(int i=0; i<ch.Length; i++) {buffer[i] = Convert.ToByte(ch[i]); }字符數組->字符串
har[] ch = new char[10]; string str = new string(ch);字符串->字符數組 string str = "abcde"; char[] ch=str .ToCharArray();字節數組->字符串 byte[] buffer = new byte[10]; string str = System.Text.Encoding.UTF8.GetString(buffer); //或者:string str = new ASCIIEncoding().GetString(buffer); 字符串->字節數組 string str = "abcde"; byte[] buffer=System.Text.Encoding.UTF8.GetBytes(str); //或者:byte[] buffer= new ASCIIEncoding().GetBytes(str);說明:主要就是用到了Convert類和System.Text命名空間下的類,Encoding是靜態類,ASCIIEncoding是實體類,方法都是一樣的!
下面介紹如何用BinaryReader來讀寫文件流
1. 寫文件
using (FileStream fs = File.Open("test.txt", FileMode.OpenOrCreate)){BinaryWriter bw = new BinaryWriter(fs, Encoding.UTF8);for (int i = 0; i < 10000000; i++) // 寫入一千萬行數據 {bw.Write(100.8); // 寫入一個Doublebw.Write("abdef"); // 寫入一個Stringbw.Write("poiu"); // 再寫一個Stringbw.Write((float)88.9); // 寫入一個float }}2. 讀取上面寫入的文件,注意要對應寫入數據類型要相匹配,讀取順序要相匹配
using (FileStream fs = File.Open("test.txt", FileMode.Open)){BinaryReader br = new BinaryReader(fs, Encoding.UTF8);while (br.BaseStream.Length > br.BaseStream.Position) // 判斷是否已讀完 {Console.WriteLine(br.ReadDouble());Console.WriteLine(br.ReadString());Console.WriteLine(br.ReadString());Console.WriteLine(br.ReadSingle());}}引用:
你平時是怎么讀取文件的?使用流讀取。是的沒錯,C#給我們提供了非常強大的類庫(又一次吹捧了.NET一番),里面封裝了幾乎所有我們可以想到的和我們沒有想到的類,流是讀取文件的一般手段,那么你真的會用它讀取文件中的數據了么?真的能讀完全么?
通常我們讀取一個文件使用如下的步驟:
1、聲明并使用File的OpenRead實例化一個文件流對象,就像下面這樣
???????FileStream fs = File.OpenRead(filename);
或者
???????FileStream fs = FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read);
2、準備一個存放文件內容的字節數組,fs.Length將得到文件的實際大小,就像下面這樣
???????byte[] data = new byte[fs.Length];
3、哇!開始讀了,調用一個文件流的一個方法讀取數據到data數組中
???????fs.Read (data, 0, data.Length);
呵呵!我們只寫了3句就可以把文件里面的內容原封不動的讀出來,真是太簡潔了!可以這段代碼真的能像你預期的那樣工作么?答案是:幾乎可以!在大部分情況下上面的代碼工作的很好,但是我們應該注意Read方法是有返回值的,既然有返回值那么一定有其道理,如果按照上面的寫法完全可以是一個沒有返回值的函數。我想返回值的目的是,為了給我們一個機會判斷實際讀取文件的大小,從而來判斷文件是否已經完全讀完。所以上面的代碼不能保證我們一定讀完了文件里面的所有字節(雖然在很多情況下是讀完了)。下面的方法提供了一個比上面方法更安全的方法,來保證文件被完全讀出
?
public static void SafeRead (Stream stream, byte[] data){int offset=0;int remaining = data.Length;// 只要有剩余的字節就不停的讀while (remaining > 0){int read = stream.Read(data, offset, remaining);if (read <= 0)throw new EndOfStreamException("文件讀取到"+read.ToString()+"失敗!");// 減少剩余的字節數remaining -= read;// 增加偏移量offset += read;} }有些情況下你不知道流實際的長度比如:網絡流。此時可以使用類似的方法讀取流直到流里面的數據完全讀取出來為止。我們可以先初始化一段緩存,再將流讀出來的流信息寫到內存流里面,就像下面這樣:
public static byte[] ReadFully (Stream stream){// 初始化一個32k的緩存byte[] buffer = new byte[32768];using (MemoryStream ms = new MemoryStream()){ //返回結果后會自動回收調用該對象的Dispose方法釋放內存// 不停的讀取while (true){int read = stream.Read (buffer, 0, buffer.Length);// 直到讀取完最后的3M數據就可以返回結果了if (read <= 0)return ms.ToArray();ms.Write (buffer, 0, read);}} }雖然上面的例子都比較簡單,效果也不是很明顯(大部分都是對的),也許你早就會了,沒關系這篇文章本來就是寫給初學者的。
下面的方法提供了一種使用指定緩存長度的方式讀取流,雖然在很多情況下你可以直接使用Stream.Length得到流的長度,但是不是所有的流都可以得到。
public static byte[] Read2Buffer (Stream stream, int BufferLen){// 如果指定的無效長度的緩沖區,則指定一個默認的長度作為緩存大小if (BufferLen < 1){BufferLen = 0x8000;}// 初始化一個緩存區byte[] buffer = new byte[BufferLen];int read=0; int block;// 每次從流中讀取緩存大小的數據,知道讀取完所有的流為止while ( (block = stream.Read(buffer, read, buffer.Length-read)) > 0){// 重新設定讀取位置read += block;// 檢查是否到達了緩存的邊界,檢查是否還有可以讀取的信息if (read == buffer.Length){// 嘗試讀取一個字節int nextByte = stream.ReadByte();// 讀取失敗則說明讀取完成可以返回結果if (nextByte==-1){return buffer;}// 調整數組大小準備繼續讀取byte[] newBuf = new byte[buffer.Length*2];Array.Copy(buffer, newBuf, buffer.Length);newBuf[read]=(byte)nextByte;buffer = newBuf;// buffer是一個引用(指針),這里意在重新設定buffer指針指向一個更大的內存read++;}}// 如果緩存太大則使用ret來收縮前面while讀取的buffer,然后直接返回byte[] ret = new byte[read];Array.Copy(buffer, ret, read);return ret; }?
轉載于:https://www.cnblogs.com/rechen/p/5088594.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的[转载]C#流,字节数组,字符串的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: error nr.1045 access
- 下一篇: vmstat命令使用