zoukankan      html  css  js  c++  java
  • C#的字节与流

         计算机中文件有很多种,我们知道实际存在计算机中的都是二进制。这里我记录了通过流对文件的读取操作。

         一、首先在这里简单涉及下位,字节,字符的概念。

         位(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

  • 相关阅读:
    使用javap分析Java的字符串操作
    使用javap深入理解Java整型常量和整型变量的区别
    分享一个WebGL开发的网站-用JavaScript + WebGL开发3D模型
    Java动态代理之InvocationHandler最简单的入门教程
    Java实现 LeetCode 542 01 矩阵(暴力大法,正反便利)
    Java实现 LeetCode 542 01 矩阵(暴力大法,正反便利)
    Java实现 LeetCode 542 01 矩阵(暴力大法,正反便利)
    Java实现 LeetCode 541 反转字符串 II(暴力大法)
    Java实现 LeetCode 541 反转字符串 II(暴力大法)
    Java实现 LeetCode 541 反转字符串 II(暴力大法)
  • 原文地址:https://www.cnblogs.com/supersnowyao/p/8327727.html
Copyright © 2011-2022 走看看