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(, SeekOrigin.Begin); //参数1 : offset
stream.Position = ;
stream.Write(buffer, , buffer.Length); //在写入的时候也是可以设置offset, but position 就不可以设置了。
buffer = new byte[stream.Length];
stream.Position = ;
long readHowMuch = stream.Read(buffer, , buffer.Length); //可以知道最终read了多少 (比如我们说要read 100, 结果里面只有30, 那么最终就是30了)
string result = Encoding.UTF8.GetString(buffer, , 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();
}
}
Stream 基础和常用的更多相关文章
- Java SE 基础:常用关键字
Java SE 基础:常用关键字 常用关键字表
- html5基础的常用的技巧
html5基础的常用的技巧 1. 新的Doctype声明 XHTML的声明太长了,我相信很少会有前端开发人员能手写出这个Doctype声明. <!DOCTYPE html PUBLIC &quo ...
- Android 基础:常用布局 介绍 & 使用(附 属性查询)
Android 基础:常用布局 介绍 & 使用(附 属性查询) 前言 在 Android开发中,绘制UI时常需各种布局 今天,我将全面介绍Android开发中最常用的五大布局 含 Andr ...
- python基础(常用内容)
python基础(常用内容) 机器数: 一个数在计算机中的二进制表示形式就是机器数. 例如: +3用机器数表示就用<00000011>表示 -3用机器数表示就用<10000011&g ...
- 十八. Python基础(18)常用模块
十八. Python基础(18)常用模块 1 ● 常用模块及其用途 collections模块: 一些扩展的数据类型→Counter, deque, defaultdict, namedtuple, ...
- Linux基础之常用基本命令备忘
Linux基础之常用基本命令备忘 PWD 查询当前所在Linux上的位置 / 根目录 CD(change directory)切换目录 语法 CD /(注意添加空格) LS ...
- Linux - nginx基础及常用操作
目录 Linux - nginx基础及常用操作 Tengine淘宝nginx安装流程 nginx的主配置文件nginx.conf 基于域名的多虚拟主机实战 nginx的访问日志功能 网站的404页面优 ...
- Redis基础类型常用操作命令
Redis基础类型常用操作命令 概念:Redis是用C语言开发的一个开源的高性能键值对数据库. 特征: 数据间没有必然的联系 内部采用单线程机制进行工作 高性能 多数据类型支持 字符串类型 Strin ...
- HTML&CSS基础-html常用的标签
HTML&CSS基础-html常用的标签 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.html的源代码 <!DOCTYPE html> <html& ...
随机推荐
- in, out, ref
C#中的函数传递方式可以为in.out.ref(引用) in方式的是默认的传递方式,即向函数内部传送值,不作讲解 很多语言都有类似的操作从函数向调用者返回值,这样我们可以通过函数的调用返回多个值,因为 ...
- 《BackboneJS框架的技巧及模式》(2)
<BackboneJS框架的技巧及模式>(2) 本文紧接第一部分:<BackboneJS框架的技巧及模式(1)> 作者:chszs,转载需注明.博客主页:http://blog ...
- Git Push 不用再次输入用户名和密码方法
前言 在大家使用github的过程中,一定会碰到这样一种情况,就是每次要push 和pull时总是要输入github的账号和密码,这样不仅浪费了大量的时间且降低了工作效率.在此背景下,本文在网上找了两 ...
- 【经典面试题】实现平方根函数sqrt
本文将从一道经典的面试题说起:实现平方根函数,不得调用其它库函数. 函数原型声明例如以下: double Sqrt(double A); 二分法 二分法的概念 求,等价于求方程的非负根(解).求解方程 ...
- mysql 查询某字段里含有(或者不含)某字符的所有记录方法(转)
select gid, username from users where FIND_IN_SET(8,gid); //查询gid里含有数字8的记录,gid是varchar ,数据格式:"1 ...
- 4G时代来临,运营商为谁搭台献唱?
4G时代已然来临.对用户而言,4G意味着更快的传输速度,以及更优质的移动网络体验. 只是对运营商而言.怎样部署4G却成了一大难题.众所周知,在全球范围内,4G LTE成为眼下最率先的移动宽带解 ...
- php递归json类实例代码
这篇文章主要介绍了php递归json类的实现方法,可以实现对索引数组及数字数组的解析,进而实现递归数组返回json字符串的功能.具体实现代码如下: <?php /* * @ anthor:QD ...
- git 取消追踪
git rm --cached filePath这个操作不会删除这个文件
- ajax与Servlet
1.后台返回text类型的数据 <%@ page language="java" import="java.util.*" pageEncoding=&q ...
- UWP APP 开发日记
最近需要使用C#开发UWP应用,以前学习过C,这回就是快速看了一下C#的一些特别之处,然后就进入到了实战练习当中. 1.按照MSDN的教程自己搭建了一个简单的“Hello, world”应用.是使用C ...