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 里了丫.
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析