.net 流(Stream) - 文件流、内存流、网络流
转自:http://www.oseye.net/user/kevin/blog/85
一、文件流 FileStream
FileStream流继承与Stream类,一个FileStream类的实例实际上代表一个文件流,使用FileStream类可以对文件系统上是文件进行读取、写入、打开和关闭操作。
创建FileStream实例
1、.Net提供多种获取FileStream对象的方法,其中构造函数就有10多种,我们看下典型的构造函数顺便讲解下参数含义:
- public FileStream(string path, FileMode mode, FileAccess access);
参数说明:
path指明文件所在的路径信息;
mode是FileMode的枚举值,表示文件打开或创建的方式,含义如下:
- CreateNew:指定操作系统应创建新文件,如果文件已经存在,则引发IOException;
- Create:指定操作系统应创建新文件,如果文件已经存在,它将被覆盖;
- Open:指定操作系统应打开现有文件,如果文件不存在,则引发FileNotFoundException;
- OpenOrCreate:指定操作系统应打开文件,如果文件不存在,则创建新文件;
- Truncate:指定操作系统应打开现有文件,文件一旦打开,就将截断为零字节大小;
- Append:打开先有文件并把Position设置至文件尾,如果文件不存在将创建新文件。Append只能同FileAccess.Write一起使用;
access是FileAccess的枚举值,它控制对文件的访问权限,含义如下:
- Read:打开文件用于只读;
- Write:打开文件用于只写;
- ReadWrite:打开文件,用于读写;
2、除了FileStream类本身提供的构造函数外,System.IO命名空间下的File和FileInfo类也提供了创建FileStream对象的方法。其中OpenRead方法返回只读文件流,OpenWrite方法返回只写文件流。如:
FileStream fs=File.OpenRead(@"c:\file.txt");
FileStream的读写方法:
public override int Read(
byte[] array, //内存缓冲区,储存从文件流中读取的数据
int offset, //array开始写入数据的下标值
int count //从文件流中读取的字节大小
);
public override void Write(
byte[] array, //内存缓冲区,存储了要写入流的字节数据
int offset, // 从array的下标值开始取数据
int count //要写入的字节数
);
FileStream实例
try
{
//写入
FileStream fileStream = new FileStream(@"d:\test.txt", FileMode.OpenOrCreate);
byte[] content = Encoding.UTF8.GetBytes("我爱我家");
fileStream.Write(content, , content.Length);
fileStream.Position = ; //设置当前位置
content = Encoding.UTF8.GetBytes("我爱你家"); fileStream.Write(content, , content.Length);
fileStream.Close(); //读取
fileStream = new FileStream(@"d:\test.txt", FileMode.Open);
content = new byte[fileStream.Length];
fileStream.Read(content, , content.Length);
Console.WriteLine(Encoding.UTF8.GetString(content));
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
二、内存流 MemoryStream
和文件流不同,MemoryStream类表示的是保存在内存中的数据流,由内存流封装的数据可以在内存中直接访问。内存一般用于暂时缓存数据以降低应用程序对临时缓冲区和临时文件的需要。
既然字节数据也在内存中存储,为什么还要引入内存流的概念呢?这是因为内存流和字节数组虽然都位于程序缓冲区,但是具有不同特性。内存流相对于字节数组而言,具有流特有的特性,并且容量可自动增长,在数据加密以及对长度不定的数据进行缓存等场合,使用内存流比较方便。
创建MemoryStream实例
MemoryStream有多种构造函数,部分举例如下:
- public MemoryStream();该构造函数初始分配的容量大小为0,随着数据的不断写入,其容量可以不断地自动扩展。
- public MemoryStream(byte[] buffer);根据字节数组buffer初始化,实例的容量大小规定为字节数组的长度。
- public MemoryStream(int capacity);容量固定为capacity。
MemoryStream实例
MemoryStream mem = new MemoryStream();
Console.WriteLine("初始分配的容量:"+mem.Capacity+" 初始使用量:"+mem.Length);
byte[] content = Encoding.UTF8.GetBytes("我爱我家");
mem.Write(content, , content.Length);
Console.WriteLine("初始分配的容量:" + mem.Capacity + " 初始使用量:" + mem.Length);
三、网络流NetWorkStream
网络流的意思是数据在网络的各个位置之间是以连续的字节形式传输的,NetWorkStream只能用于面向连接的套接字。
对于NetWorkStream流,写入操作是指从来源端内存缓冲区到网络上的数据传输;读取操作是从网络上到接收端内存缓冲区的数据传输。
如需对NetWorkStream深入了解,请查阅相关资料。
.net 流(Stream) - 文件流、内存流、网络流的更多相关文章
- 流Stream 文件File 流IO
Java 流(Stream).文件(File)和IO Java.io 包几乎包含了所有操作输入.输出需要的类.所有这些流类代表了输入源和输出目标. Java.io 包中的流支持很多种格式,比如:基本类 ...
- Java之IO流进阶篇:内存流,打印流,对象流
Java中的IO流,即为输入输出流.所谓输入输出流,都是相对于程序而言,程序就是这个参照物.一张图看懂输入输出流: 输入流抽象基类:InputStream,Reader 输出流抽象基类:OutputS ...
- Core Java - 流(Stream) - 字节流和字符流(一)
0. 概述: Java中基于流的I/O构建在4个抽象类之上, 其中2个是字节流,另外2个是字符流. 字节流: InputStream / OutputStream 当操作字节或其它二进制对象时,应当使 ...
- nodeJS之流stream
前面的话 当内存中无法一次装下需要处理的数据时,或者一边读取一边处理更加高效时,我们就需要用到数据流.NodeJS中通过各种Stream来提供对数据流的操作.本文将详细说明NodeJS中的流strea ...
- [转载]C# MemoryStream(内存流)
MemoryStream位于System.IO命名空间,为系统内存提供流式的读写操作.常作为其他流数据交换时的中间对象操作. 1.MemoryStream类封装一个字节数组,在构造实例时可以使用一个字 ...
- 使用文件流与使用缓冲流完成文件的复制操作性能对比,文件流 FileInputStream FileOutputStream 缓冲流: BufferedInputStream BufferedOutputStream
package seday06; import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOExc ...
- 零基础学习java------day17------缓冲字节流,转换字节流,简化流,缓冲字符流,序列化和对象流
1. 缓冲字节流 缓冲区:缓冲区实质上是一个数组.通常它是一个字节数组,但是也可以使用其他种类的数组.但是一个缓冲区不 仅仅 是一个数组.缓冲区提供了对数据的结构化访问,而且还可以跟踪系统的读/写进程 ...
- delphi中如何将一整个文件读入内存
来源 https://bbs.csdn.net/topics/390985048 分配一块大内存吧,要是一下申请不了64M那么大,就多申请几块小的,用个链表连起来.用FileStream类的方法读取文 ...
- C#流总结(文件流、内存流、网络流、BufferedStream、StreamReader/StreamWriter、TextReader/TextWriter)
一.文件流 FileStream类主要用于读写磁盘文件.常用于向磁盘存储数据或读取配置文件. 读取文件: //文件流:读取 FileStream fileStream = File.Open(@&qu ...
随机推荐
- 关于 vertical-align 的一些小知识
引子 在日常开发过程中,我们经常会遇到如下的场景,一行中既有图片也有文字,而且图片还要和文字对齐.效果如下: 通常代码如下: <!DOCTYPE html> <html> &l ...
- eclipse相关问题汇总
安装subclipse svn工具: 配置JavaHL:http://subclipse.tigris.org/wiki/JavaHL#head-5bf26515097c3231c1b04dfdb22 ...
- 案例20-页面使用redis缓存显示类别菜单
1 准备工作 1 需要导入所需要的jar包. 2 启动windows版本的redis服务端 3 准备JedisUtils工具类的配置文件redis.properties redis.maxIdle= ...
- 游戏中的网络同步机制——Lockstep(帧同步)
本文来自: https://bindog.github.io/blog/2015/03/10/synchronization-in-multiplayer-networked-game-lockste ...
- poj 1168 The Triangle
The Triangle Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 39169 Accepted: 23518 De ...
- Learning Linux Commands: awk--reference
http://how-to.linuxcareer.com/learning-linux-commands-awk 1. Introduction In this case, the title mi ...
- 【转】C++和Java比较
"作为一名C++程序员,我们早已掌握了面向对象程序设计的基本概念,而且Java的语法无疑是非常熟悉的.事实上,Java本来就是从C++衍生出来的." 然而,C++和Java之间仍存 ...
- Firebird Connection pool is full
今天在做Firebird V3.0.3 x64 版本内存测试,本地PC上,准备开启800个事务(保持不关闭),每个事务做些事,尽量不释放内存. 每次测试当事务数达到时,就提示Connection p ...
- yii1的笔记
$sql = 'SELECT * FROM to8to_worker_item limit 10'; $res = Yii::app()->db->createCommand($sql)- ...
- Expression Blend实例中文教程(5) - 布局控件快速入门StackPanel,ScrollViewer和Border
上一篇,介绍了Canvas布局控件在Blend中的使用.本篇继续介绍布局控件StackPanel,ScrollViewer和Border. 相对于Grid和Canvas来说,StackPanel,Sc ...