zoukankan      html  css  js  c++  java
  • 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(@"~	empstream	ext.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 里了丫. 

  • 相关阅读:
    微信第三方登录,ios第三方登录(没有进行二次封装,直接调用)
    How Do I Declare A Block in Objective-C?
    Android与JS混编(js调用java)
    React-Native做一个文本输入框组件
    如何在程序退出的时候清除activity栈
    React react-ui-tree的使用
    React-Native OpenGL体验二
    React-Native OpenGL体验一
    react-native使用react-art制作SVG动画
    Android画一个随意拖动的圆形
  • 原文地址:https://www.cnblogs.com/keatkeat/p/4169196.html
Copyright © 2011-2022 走看看