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

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

位(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, , (int)source.Length);
  8.  
  9. Output(buffer);
  10. }

循环读取:

  1. 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 = ;
  9. byte[] buffer = new byte[bufferSize];
  10. int bytesREad;
  11. while((bytesREad= source.Read(buffer, , bufferSize)>))
  12. {
  13. destStream.Write(buffer, , bytesREad);
  14. }
  15. source.Dispose();
  16. destStream.Dispose();
  17. }

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

C#的字节与流的更多相关文章

  1. Java:IO流其他类(字节数组流、字符数组流、数据流、打印流、Properities、对象流、管道流、随机访问、序列流、字符串读写流)

    一.字节数组流: 类 ByteArrayInputStream:在构造函数的时候,需要接受数据源,而且数据源是一个字节数组. 包含一个内部缓冲区,该缓冲区包含从流中读取的字节.内部计数器跟踪 read ...

  2. Java基础知识强化之IO流笔记28:BufferedOutputStream / BufferedInputStream(字节缓冲区流) 之BufferedOutputStream写出数据

    1. BufferedOutputStream / BufferedInputStream(字节缓冲区流)的概述 通过定义数组的方式确实比以前一次读取一个字节的方式快很多,所以,看来有一个缓冲区还是非 ...

  3. Java IO学习笔记(三)转换流、数据流、字节数组流

    转换流 1.转换流:将字节流转换成字符流,转换之后就可以一个字符一个字符的往程序写内容了,并且可以调用字符节点流的write(String s)方法,还可以在外面套用BufferedReader()和 ...

  4. JAVA IO分析二:字节数组流、基本数据&对象类型的数据流、打印流

    上一节,我们分析了常见的节点流(FileInputStream/FileOutputStream  FileReader/FileWrite)和常见的处理流(BufferedInputStream/B ...

  5. IO知识点整理(序列化,管道流,数据流,字节数组流,与编码)

    一:序列化的问题 1.序列号的使用问题 关于在序列化中的序列号的使用问题,一般要是使用. 因为,每次要序列化的类产生都会产生一个一个新的序列号,如果将这个类的程序修改后,就会产生新的序列号,以前序列化 ...

  6. Java基础-IO流对象之字节缓冲流(BufferedOutputStream与BufferedInputStream)

    Java基础-IO流对象之字节缓冲流(BufferedOutputStream与BufferedInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在我们学习字 ...

  7. 6.5(java学习笔记)其他流(字节数组流,数据流,对象流,打印流)

    一.字节数组流 之前使用输入输出流的操作的对象是文件,而这里字节数组流操作的对象是内存,内存可以看做是一个字节数组. 使用字节数组流读写就可以看做是从内存A到内存B的读写,对象时内存即字节数组. 1. ...

  8. java——io、字节流缓冲区拷贝文件、字节缓冲流

    使用try catch finally关闭文件流: 写入文件: import java.io.*; public class exp{ public static void main(String[] ...

  9. Java文件与io——字节数组流数据流字符串流

    字节数组流 ByteArrayInputStream:包含一个内部缓冲区,该缓冲区包含从流中读取的字节.内部计数器跟踪read方法要提供的下一个字节.关闭ByteArrayInputStream无效. ...

  10. Java基础IO类之字节数组流

    package IODemo; //字节数组流 :内部维护这着一个字节数组,我们可以利用流的读取机制来处理字符串 无需关闭,不会报IO异常 // ByteArrayInputstream ByteAr ...

随机推荐

  1. LoadLinked/StoreConditional (LL/SC)

    MIPS中LL/SC指令介绍 MIPS32中的LL.SC指令说明 理解MIPS指令集中的ll (load linked) 和 sc 你用ll指令读取一个内存中的数据并存到一个寄存器,然后在寄存器修改( ...

  2. Java并发(二)-实现同步

    并发带来的问题 先看一个单例类,后文中都会用到: public class SimpleWorkingHardSingleton { private static SimpleWorkingHardS ...

  3. 【Java】java运行jar时,报 java.lang.UnsupportedClassVersionError

    问题现象: java运行jar时,报 java.lang.UnsupportedClassVersionError java  -jar  main.jar -h 192.168.221.171  - ...

  4. (转)Db2数据库一次生产故障详细记录---数据库坏页

    原文:http://www.talkwithtrend.com/Article/216335 前言 数据库最严重的故障莫过于数据库损坏.数据库坏页是数据库损坏的一种,如果数据库中有数据页出现损坏,在没 ...

  5. jenkins自动部署tomcat

    关于部署的3种思路: 远程部署(jenkins编译部署到远程服务器): 安装ssh插件 ssh插件配置 添加远程jenkins服务器节点: 本地部署(与jenkins在同一服务器): 关于maven构 ...

  6. safari input默认样式

    在i标签下嵌套一个input标签  设置了 -webkit-apprarence:none: 设置了宽高,和padding:3px 结果placeholder显示不全 经排查 这时候的input默认有 ...

  7. URL编码分析与乱码解决方案

    一.问题的由来 URL就是网址,只要上网,就一定会用到. 一般来说,URL只能使用英文字母.阿拉伯数字和某些标点符号,不能使用其他文字和符号.比如,世界上有英文字母的网址"http://ww ...

  8. lucene源码分析(8)MergeScheduler

    1.使用IndexWriter.java mergeScheduler.merge(this, MergeTrigger.EXPLICIT, newMergesFound); 2.定义MergeSch ...

  9. Linux内核编程规范与代码风格

    source: https://www.kernel.org/doc/html/latest/process/coding-style.html translated by trav, travmym ...

  10. Keepalived 无法自动转换主备角色,请关注 iptables 防火墙配置

    最近在研究服务器高可用集群 (HA)…… 搭建了主备两台Keepalived,配置什么的全是网上照抄的,被验证过无数遍的示例…… 然而Master和Backup无法自动切换.两边会同时绑定浮动IP(V ...