Stream 基础和常用
更新 : 2018-08-05
File 和 FileInfo 的区别
其实都是一样的,唯一不同只是说 File 适合用于对一个文件单次操作.
而 FileInfo 比较适合对一个文件多次操作.
FileStream 则是对文件的读写, 通过 File.Open, File.Create 我们可以获取到 file stream 然后就可以读写了.
来源 : http://www.cnblogs.com/jimmyzheng/archive/2012/03/17/2402814.html 系列
目前只作为个人参考.
微软的 stream 结构
老大是 Stream(抽象类) -> TextReader(抽象类) -> StreamReader(实体类) -> MemoryStream(实体类),FileStream...等等
第4层比较具体了,比较是针对性的类了
basic :
1 bit ( 1个2进制 )
8 bit = 1 byte ( 8个2进制 = 1字节 )
stream (流,流里面有多个字节)
英文字母是一个字节,汉字是2个字节 (也要base on Encode手法)
char 是字符类型 . on c# 1 char = 2字节 (代表一个字符)
表示多个字符用 char[] 数组, String 则是微软封装的一个上层, 对char的简单控制。
String 里面装了 char[], char的length是不可以改变的, 但是string可以
stream 的 read write 逻辑 :
调整好 stream 的 position
write(buffer,offset,length) 参数一是一个你要写入进去stream的一组字节, offset是针对stream position做偏移, length 是你要写入多少.
read (buffer,offset,length) 和上面的一样,只不过这次的buffer应该是一个空的,read了会把stream中的字节放入到buffer中.
常用 :
byte[] buffer = null; string testString = "Stream!Hello world 我"; buffer = Encoding.UTF8.GetBytes(testString); //string to byte (汉字算2字节哦,当然也要考虑的你的encode手法 UTF8,Unicode,ASCII的不同都可能影响字节数) using (MemoryStream stream = new MemoryStream()) { //最需要注意的是 position, read write 会auto调整position的, 所以养成好习惯,每次自己控制检查 //设置position的方法有 : stream.Seek(0, SeekOrigin.Begin); //参数1 : offset stream.Position = 0; stream.Write(buffer, 0, buffer.Length); //在写入的时候也是可以设置offset, but position 就不可以设置了。 buffer = new byte[stream.Length]; stream.Position = 0; long readHowMuch = stream.Read(buffer, 0, buffer.Length); //可以知道最终read了多少 (比如我们说要read 100, 结果里面只有30, 那么最终就是30了) string result = Encoding.UTF8.GetString(buffer, 0, buffer.Length); //byte to string }
//简单的readToEnd string filePath = Server.MapPath(@"~\temp\stream\text.txt"); using (FileStream stream = File.OpenRead(filePath)) //直接打开, 文件不在会error { using (StreamReader reader = new StreamReader(stream, Encoding.UTF8, false)) //告诉它是什么encode,就强转了, 参数3 : 是否用智能判断encode { string x = reader.ReadToEnd(); } }
Encoding.UTF8.GetString(memoryStream.ToArray()); // 或者这招也可以 stream to string
clear stream 的方法是:
stream.SetLength(0)
close displose flush
close 和 displose 几乎是一样的, displose 内会调用 close, 顾名思义, close 之后或许还能开, displose 之后肯定是不行啦. 我一般上是用 using. 两个都不会用到
flush 是说把缓冲区的写入 target. 比如 file stream wirte 的时候并没有真的写入到 file 而是先在缓冲区而已.
memorystream 的话 flush 就没有意义了。因为就已经在 ram 里了丫.