C# 流


文章:https://www.cnblogs.com/ForEvErNoME/archive/2012/09/02/2633876.html 提供了一个类图继承关系
文章:https://www.cnblogs.com/supersnowyao/p/8327727.html 一个2进制流读写的封装

流:用来进行数据的永久存储和计算机之间传递。
几种不同的stram,都继承自抽象的stream类。
FileStream:对文件进行读写
MemoryStream:对内存块进行读写
NetworkStream:向其他计算机读写数据
GZipStream:压缩数据

字节(byte):由8位组成(bit),可以表示0-255,是256个不同的数据;
字符:字符根据编码的不同有所区别;
编码分成2种,ANSI编码,Unicoide编码。
ANSI编码:不同 ANSI 编码之间互不兼容。在简体中文系统下,ANSI 编码代表 GB2312 编码,在日文操作系统下,ANSI 编码代表 JIS 编码。对于字符来说ANSI以单字节存放英文字符,以双字节存放中文等字符。
Unicoide编码:用来给 UNICODE 字符集编码的标准有很多种,比如:UTF-8, UTF-7, UTF-16, UnicodeLittle, UnicodeBig 等。UTF-8:是表示一个字符是可变的,有可能是用一个字节表示一个字符,也可能是两个,三个。当然最多不能超过3个字节了。反正是根据字符对应的数字大小来确定。UTF-16:任何字符对应的数字都用两个字节来保存。
而2进制编码(可能没有这种说法)是指按照某种编码的方式处理字母,而数字就直接使用字节对应的大小表示,就像int类型一样。比如:123abc对应处理为,处理数字123为int类型,abc为utf-8格式的字符串。

对象串行化:Serializable
对对象进行串行化时,对象的所有的引用对象都会串行化。
将对象串行化到一个文件时,会以2进制格式写入文件。比如数字123,如果以2进制写入就是123的2进制表示的格式,但如果以Unicode格式写入,就会变成‘1’‘2’‘3’,内存占用会变大。所以格式有2种,2进制格式和Unicode格式(Ascll格式)。2种格式不同之处在于对数字的处理,而对于字符和字符串都使用Unicode编码。处理完成之后统一变成字节数组,另外,C#里好像没有字节流和字符流这种说法,java中有。

C#存储文本使用Unicode格式。数据作为字节写到一个文件时,就是将各个Unicode码写入文件。string与char都是采用Unicode格式在内存中存储数据。作为数据传输时,2进制和Unicode编码都是以字节即01的形式传输的,存储时,使用文本编辑器阅读时,‘1’的Unicode编码就是‘1’,而数字转换为字节后对应了其他的Unicode编码,比如:正方形,字母等,所以不可读。

对于2进制编码,比如2个int类型,当读2进制数据时,程序并不知道,是读2个int还是读1个double。所以需要手动去读。这时数字和字母是分开的,比如字符串使用utf-8格式,而纯数字使用字节对应的大小表示。
比如:
int i = ReadInt32()
string s = ReadString()
byte[] bt = ReadBytes(4)等方式。

FileMode 是指确定如何打开或创建文件,枚举类型
Append 打开现有文件并查到文件尾
Create 创建新文件,若文件存在则覆盖
CreateNew 创建新文件
Open 打开现有文件
OpenOrCreate 打开现有文件(文件存在)或创建新文件

C#中的流、字节、字符和字符串
流:二进制
字节:无符号整数
字符:Unicode编码字符
字符串:多个Unicode编码字符
那么在.net下它们之间如何转化呢?
一般是遵守以下规则:
流->字节数组->字符数组->字符串,这个过程不是绝对的。
MemoryStream ms = new MemoryStream();//假如存在一个内存流
byte[] b = new byte[1024];
ms.Read(b,0,(int)ms.Length);//将流中的数据存到字节数组中
char[] c = new char[1024];
c = Encoding.UTF8.GetChars(b);//将字节数组数据存到字符数组
string str = new string(c);//将字符数组数据存到字符串
//反过来
str = "123abc";
c = str.ToCharArray();
b = Encoding.UTF8.GetBytes(c);
ms = new MemoryStream(b);
文章: https://blog.csdn.net/bowltwood/article/details/53289010

1,使用FileStream:
string path = @"F:\test.txt";文件面前加@表示不对字符串转义(比如\t,\n)
CreatFile(path);
FileStream filestream = new FileStream(path, FileMode.Append);
filestream.Write(new byte[] { (byte)'h',(byte)'e'},0,2);
filestream.Close(); 必须关闭流,否则其他流就不能再对文件进行操作
public void CreatFile(string path)
{
    FileStream f = File.Create(path);
    f.Close();
}

void Start () {
    string path = @"F:\test.txt";
    FileStream fs = File.Open(path,FileMode.Append);
    byte[] b = {(byte)'1', (byte)'2', (byte)'3' };
    fs.Write(b,0,b.Length);//因为打开模式是Append,所以从0开始其实就是从原本文件的数据的末尾写入
    byte[] b2 = { (byte)1, (byte)2, (byte)3 };
    fs.Write(b2, 0, b.Length);//结果为123加2个正方形符号
}

StreamWriter是对FileStream封装之后的类,更加方便
StreamWriter writer = new StreamWriter(path,false);//false表示删除创建新的文件,true表示追加
writer.Write("xxx{0}xxxx{1}xxxx","ni","hao");//{0}{1}表示参数
writer.Close();
StreamReader reader = new StreamReader(path);
print(reader.ReadToEnd());

2,NetWorkStream类
NetWorkStream类是专门用来处理服务器与客户端通信的流。
public void CreatClient()
{
    TcpClient client = new TcpClient();
    client.Connect("192.168.0.104", 5000);
    NetworkStream ns = client.GetStream();//得到网络流,这个应该是从服务器返回回来的
    byte[] b = Encoding.UTF8.GetBytes("ni hao 大波妹");
    ns.Write(b, 0, b.Length);
    ns.Flush();//刷新流中的数据,这个应该就是向服务器发送消息
    ns.Close();
}
public void CreatServer()
{
    TcpListener server = new TcpListener(5000);
    server.Start();
    Socket s = server.AcceptSocket();//阻塞,直到有客户端连接,我猜这个是,客户端连接之后返回一个流回去
    NetworkStream ns = new NetworkStream(s);
    if (ns.DataAvailable)//如果客户端发送了消息
    {
        byte[] b = new byte[1024];
        int length = ns.Read(b, 0, b.Length);
        string str = Encoding.UTF8.GetString(b, 0, length);
        GameObject.Find("Text").GetComponent<Text>().text = str;
    }
}

3,其他流暂时不看

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值