電腦中文件有很多種,我們知道實際存在電腦中的都是二進位。這裡我記錄了通過流對文件的讀取操作。 一、首先在這裡簡單涉及下位,位元組,字元的概念。 位(bit):可以表示0或1; 位元組(byte):由8位組成(bit),可以表示0-255,是256個不同的數據; 字元:字元根據編碼的不同有所區別; A ...
電腦中文件有很多種,我們知道實際存在電腦中的都是二進位。這裡我記錄了通過流對文件的讀取操作。
一、首先在這裡簡單涉及下位,位元組,字元的概念。
位(bit):可以表示0或1;
位元組(byte):由8位組成(bit),可以表示0-255,是256個不同的數據;
字元:字元根據編碼的不同有所區別;
ANSI編碼(本地化):它是支持本地的編碼方式,不同 ANSI 編碼之間互不相容。在簡體中文系統下,ANSI 編碼代表 GB2312 編碼,在日文操作系統下,ANSI 編碼代表 JIS 編碼。對於字元來說ANSI以單位元組存放英文字元,以雙位元組存放中文等字元。
Unicoide編碼:Unicode下,英文和中文的字元都以雙位元組存放。用來給 UNICODE 字元集編碼的標準有很多種,比如:UTF-8, UTF-7, UTF-16, UnicodeLittle, UnicodeBig 等。
UTF-8:是表示一個字元是可變的,有可能是用一個位元組表示一個字元,也可能是兩個,三個。當然最多不能超過3個位元組了。反正是根據字元對應的數字大小來確定。
UTF-16:任何字元對應的數字都用兩個位元組來保存。
二、C# Stream流的主要用途就是與應用程式外部的文件或者數據源進行數據交互。
有文件流FileStream,網路流NetwrokStream,訪問網路時InputStream,OutputStream等。流的內部就是對二進位數據的讀取。
流可以一次性讀取,也可以迴圈讀取。
一次性讀取:
1 public void Read()
2 {
3 string filePath = Environment.CurrentDirectory + "/content.txt";
4 Stream source = new FileStream(filePath, FileMode.Open, FileAccess.Read);
5
6 byte[] buffer = new byte[source.Length];
7 int bytesRead = source.Read(buffer, 0, (int)source.Length);
8
9 Output(buffer);
10 }
迴圈讀取:
public void ReadLoop()
2 {
3 string filePath = Environment.CurrentDirectory + "/content.txt";
4 string fileDest = Environment.CurrentDirectory + "/dest.txt";
5 Stream source = new FileStream(filePath, FileMode.Open, FileAccess.Read);
6 Stream destStream = new FileStream(fileDest, FileMode.Create, FileAccess.Write);
7
8 int bufferSize = 10;
9 byte[] buffer = new byte[bufferSize];
10 int bytesREad;
11 while((bytesREad= source.Read(buffer, 0, bufferSize)>0))
{
destStream.Write(buffer, 0, bytesREad);
}
18 source.Dispose();
19 destStream.Dispose();
20 }
StreamReader, StreamWriter。StringReader, StringWriter。它們是流的包裝器類,方便對流的讀取。以下是示例代碼:
1 public void StreamReaderRead()
2 {
3 string filePath = Environment.CurrentDirectory + "/content.txt";
4 Stream source = new FileStream(filePath, FileMode.Open, FileAccess.Read);
5 StreamReader sr = new StreamReader(source);//Stream包裝器類
6 string text = sr.ReadToEnd();
7
8 Console.Write(text);
9 }
1 public void StreamWriterWrite()
2 {
3 string filePath = Environment.CurrentDirectory + "/content.txt";
4 string fileDest = Environment.CurrentDirectory + "/dest1.txt";
5
6 Stream source = new FileStream(filePath, FileMode.Open, FileAccess.Read);
7
8 StreamReader sr = new StreamReader(source);//Stream包裝器類
9 string text = sr.ReadToEnd();
10
11 StreamWriter sw = new StreamWriter(fileDest);//Stream包裝器類
12 sw.Write(text);
13 sw.Flush();
14 sw.Close();
15 }
三、二進位位元組流讀寫封裝
完成以下功能:
- 只針對記憶體位元組流的讀寫,主要應用於數據的解析和寫入。
- 提供不同數據類型的讀寫介面,包括byte,short,int,float,string等。
- 處理了大小端數據轉換的問題,所以可用於網路數據的解析和發送。
1 using System.IO; 2 using System.Net; 3 using System; 4 5 namespace Framework 6 { 7 public class NetStream 8 { 9 private MemoryStream stream; 10 private BinaryReader reader; 11 private BinaryWriter writer; 12 13 public NetStream(byte[] buffer = null) 14 { 15 if (buffer == null) 16 { 17 this.stream = new MemoryStream(); 18 } 19 else 20 { 21 this.stream = new MemoryStream(buffer); 22 } 23 24 this.reader = new BinaryReader(this.stream); 25 this.writer = new BinaryWriter(this.stream); 26 } 27 28 public void Close() 29 { 30 this.stream.Close(); 31 this.reader.Close(); 32 this.writer.Close(); 33 } 34 35 //------------------------------------------------------------------------------- 36 37 public long ReadInt64() 38 { 39 return IPAddress.HostToNetworkOrder(this.reader.ReadInt64()); 40 } 41 42 public int ReadInt32() 43 { 44 return IPAddress.HostToNetworkOrder(this.reader.ReadInt32()); 45 } 46 47 public short ReadInt16() 48 { 49 return IPAddress.HostToNetworkOrder(this.reader.ReadInt16()); 50 } 51 52 public byte ReadByte() 53 { 54 return this.reader.ReadByte(); 55 } 56 57 public float ReadFloat() 58 { 59 return this.reader.ReadSingle(); 60 } 61 62 public string ReadString8() 63 { 64 return System.Text.Encoding.UTF8.GetString(this.reader.ReadBytes(ReadByte())); 65 } 66 67 public string ReadString16() 68 { 69 return System.Text.Encoding.UTF8.GetString(this.reader.ReadBytes(ReadInt16())); 70 } 71 72 public long Seek(long offset) 73 { 74 return this.stream.Seek(offset, SeekOrigin.Begin); 75 } 76 77 //------------------------------------------------------------------------------- 78 79 public void WriteByte(byte value) 80 { 81 this.writer.Write(value); 82 } 83 84 public void WriteInt16(short value) 85 { 86 this.writer.Write(BitConverter.GetBytes(IPAddress.HostToNetworkOrder(value))); 87 } 88 89 public void WriteInt32(int value) 90 { 91 this.writer.Write(BitConverter.GetBytes(IPAddress.HostToNetworkOrder(value))); 92 } 93 94 public void WriteInt64(long value) 95 { 96 this.writer.Write(BitConverter.GetBytes(IPAddress.HostToNetworkOrder(value))); 97 } 98 99 public void WriteFloat(float value) 100 { 101 this.writer.Write(value); 102 } 103 104 public void WriteString8(string value) 105 { 106 byte[] byteArray = System.Text.Encoding.UTF8.GetBytes(value); 107 108 WriteByte((byte) byteArray.Length); 109 110 this.writer.Write(byteArray); 111 } 112 113 public void WriteString16(string value) 114 { 115 byte[] byteArray = System.Text.Encoding.UTF8.GetBytes(value); 116 117 WriteInt16((short) byteArray.Length); 118 119 this.writer.Write(byteArray); 120 } 121 122 public byte[] GetBuffer() 123 { 124 return this.stream.ToArray(); 125 } 126 127 public int GetLength() 128 { 129 return (int) this.stream.Length; 130 } 131 } 132 }
轉載鏈接:http://blog.csdn.net/qq_26054303/article/details/53019064
http://blog.csdn.net/tom_221x/article/details/72330107