C# 温故而知新:Stream篇(—)
http://www.cnblogs.com/JimmyZheng/archive/2012/03/17/2402814.html
基本概念重点看这一篇。
什么是Stream?
MSDN 中的解释太简洁了: 提供字节序列的一般视图
(我可不想这么理解,这必定让我抓狂,我理解的流是向自然界的河流那样清澈而又美丽,c#中的流也是一样,许多技术或者说核心技术都需要流的帮忙)
那什么是字节序列呢?
其实简单的来理解的话字节序列指的是:
字节对象都被存储为连续的字节序列,字节按照一定的顺序进行排序组成了字节序列
那什么关于流的解释可以抽象为下列情况:
打个比方:一条河中有一条鱼游过,这个鱼就是一个字节,这个字节包括鱼的眼睛,嘴巴,等组成8个二进制,显然这条河就是我们的核心对象:流
*4: void Flush():这点必须说得仔细些:
当我们使用流写文件时,数据流会先进入到缓冲区中,而不会立刻写入文件,当执行这个方法后,缓冲区的数据流会立即注入基础流
MSDN中的描述:使用此方法将所有信息从基础缓冲区移动到其目标或清除缓冲区,或者同时执行这两种操作。根据对象的状态,可能需要修
改流内的当前位置(例如,在基础流支持查找的情况下即如此)当使用 StreamWriter 或 BinaryWriter 类时,不要刷新 Stream 基对象。
而应使用该类的 Flush 或 Close 方法,此方法确保首先将该数据刷新至基础流,然后再将其写入文件。
(红色部分为关键请大家务必能够理解,今后会在相应的章节中介绍)
*9: abstract void Write(byte[] buffer,int offset,int count)
这个方法包含了3个关键的参数:缓冲字节数组,位移偏量和读取字节个数
和read方法不同的是 write方法中的第一个参数buffer已经有了许多byte类型
的数据,我们只需通过设置 offset和count来将buffer中的数据写入流中
*10: virtual void Close()
关闭流并释放资源,在实际操作中,如果不用using的话,别忘了使用完流之后将其关闭
这个方法特别重要,使用完当前流千万别忘记关闭!
C# 温故而知新:Stream篇(二)
http://www.cnblogs.com/JimmyZheng/archive/2012/03/19/2405216.html#no1
详细介绍了TextReader和StreamReader的定义概念和一些注意事项,
C#--流与文件(Stream & File)(一)
http://www.cnblogs.com/long-gengyun/archive/2010/03/28/1698681.html
- 流概念
流是字节序列的抽象概念,如文件的操作,输入/输出设备,内部进行通信的管道等,Stream类及其派生类提供这些不同类型的输入和输出的一般视图,这样的程序员就不必熟悉操作系统和基础设备的具体细节,也可以对流进行操作。
流常用的三个基本操作:
1. 读取流:操作是从流到数据结构的数据传输
2. 写入流:该操作时从数据结构到流的数据传输
3. 流支持查找:查找是对流内的当前位置进行查询与修改
以上三个功能可以通过CanRead ,CanWrite,CanSeek属性进行设置。
Read和Write方法支持读写各种不同格式的数据。对于支持查找功能的流,可以使用Seek和SetLength方法以及Length和Position属性查询和修改流当前的位置和长度。
有些流实现执行数据的本地缓冲以提高性能。对于这样的流,Flush方法可用于清除内部缓冲区并确保将所有数据写入数据源或存储器。
在实现Stream的派生类时,必须提供Read和Write方法的实现。异步方法BeginRead,EndRead,BeginWrite和EndWrite通过同步方法Read和Write实现。ReadByte和WriteByte可以实现创建一个新的单元字节数组,然后调用Read和Write实现。
- 文件概述
文件在操作时表现为流,即流是从一些输入中读取到的一系列字节。
文件按信息在外部存储器上腭编码方式可以分为文本文件和二进制文件。
Stream类是System.IO命名空间中的一个类,在System.IO命名空间中,包含所有允许在数据流和文件上进行同步和异步读取和写入的类,下面简单介绍一下常用的类。
1. Directory类:包含了所有操作目录的静态方法,如目录的创建,移动,复制,删除等
2. DirectoryInfo类:包含了所有操作目录的实例方法,如目录的各种属性(名字,创建时间),目录的各种操作(目录的创建,是否存在,移动,删除等)
3. File类:是对文件的典型操作,提供文本的创建,打开,复制,删除,移动等静态方法。也可以用于获取文件和设置文件的基本信息。
4. FileInfo类:对文件的典型操作, 提供文本的创建,打开,复制,删除,移动等实例方法。当文件需要多次重用时,使用FileInfo类提供的实例方法,不可以使用File提供的静态方法。
5. FileStream类:该类实现了对文件读取,写入,打开,关闭操作,支持随机访问文件,可以使用同步方式打开文件进行读写,也可以用异步方式打开文件进行读写。
6. Path类:该类对包含文件或目录路径信息的String实例操作,这些操作可以跨平台的方式执行的。
7. MemoryStream类:该类创建起支持存储区为内存的流。
8. StreamReader类:该类可以读取标准文本文件的内容。即实现一个TextReader。默认编码格式为UTF-8。
9. StreamWriter类:该类可以往标准文本文件中写入内容。即实现一个TextWriter。默认编码格式为UTF-8。
10. StringReader类: 该类实现从字符串进行读取的TextReader。
11. StringWriter类:该类实现将信息写入字符串,该信息存储在基础的StringBuilder中。
12. TextReader类:该类表示可读取连续字符系统的阅读器。
13. TextWriter类:该类表示可以编写一个有序字符系列的编辑器,是抽象类。
C#:文件、byte[]、Stream相互转换
http://www.cnblogs.com/warioland/archive/2012/03/06/2381355.html
/// C# Stream 和 byte[] 之间的转换
/// 将 Stream 转成 byte[] public byte[] StreamToBytes(Stream stream)
{
byte[] bytes = new byte[stream.Length];
stream.Read(bytes, , bytes.Length);
// 设置当前流的位置为流的开始
stream.Seek(, SeekOrigin.Begin);
return bytes;
} /// 将 byte[] 转成 Stream public Stream BytesToStream(byte[] bytes)
{
Stream stream = new MemoryStream(bytes);
return stream;
}
///Stream 和 文件之间的转换 ///将 Stream 写入文件
public void StreamToFile(Stream stream,string fileName)
{
// 把 Stream 转换成 byte[]
byte[] bytes = new byte[stream.Length];
stream.Read(bytes, , bytes.Length);
// 设置当前流的位置为流的开始
stream.Seek(, SeekOrigin.Begin);
// 把 byte[] 写入文件
FileStream fs = new FileStream(fileName, FileMode.Create);
BinaryWriter bw = new BinaryWriter(fs);
bw.Write(bytes);
bw.Close();
fs.Close();
}
///从文件读取 Stream public Stream FileToStream(string fileName)
{
// 打开文件
FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read);
// 读取文件的 byte[]
byte[] bytes = new byte[fileStream.Length];
fileStream.Read(bytes, , bytes.Length);
fileStream.Close();
// 把 byte[] 转换成 Stream
Stream stream = new MemoryStream(bytes);
return stream;
}