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 里了丫. 

 

posted @ 2014-12-17 13:33  兴杰  阅读(317)  评论(0编辑  收藏  举报