FileStream类
使用FileStream能够对对系统上的文件进行读、写、打开、关闭等操作。并对其他与文件相关的操作系统提供句柄操作,如管道,标准输入和标准输出。读写操作可以指定为同步或异步操作。FileStream对输入输出进行缓冲,从而提高性能。
FileStream 对象支持使用 Seek 方法对文件进行随机访问。Seek 允许将读取/写入位置移动到文件中的任意位置。这是通过字节偏移参考点参数完成的。字节偏移量是相对于查找参考点而言的,该参考点可以是基础文件的开始、当前位置或结尾,分别由 SeekOrigin 类的三个属性表示。
FileStream会自动缓冲数据,通过Flush()能够强制输出缓冲区中的数据。FileStream和其他流都会占用不在.net管理范围的资源,因此FileStream在使用完成之后应该调用Dispose()方法或者通过using关键字调用。Dispose()方法会调用Close()方法,Close()方法会调用Flush()方法。这就是为什么在释放资源前,会自动输出缓冲区内的数据。
FileStream中用到了好几个枚举,因此有必须对这些枚举的有一定的了解,首先先来看看FileMode枚举,FileMode枚举是一个简单枚举,用于指定操作系统打开文件的方式。更详细请查看:http://www.cnblogs.com/kissdodog/archive/2013/01/19/2868125.html
枚举成员 成员值 描述 CreateNew 1 指定操作系统应创建新文件,如果文件存在则引发异常。
Create 2 指定操作系统创建新文件,如果文件已存在则覆盖之。
OPen 3 指定 操作系统应打开现有文件,如果文件不存在则抛出异常。
OpenOrCreate 4 指定操作系统应打开文件,如果文件不存在则创建之。
Truncate 5 指定操作系统打开现有文件,如果文件已存在则清空,从Truncate打开的文件中读取将引发异常。
Append 6 若文件存在,则找到文件并找到文件结尾,或者创建一个新文件。
再下来是FileAccess枚举,FileAccess用于控制对文件的读访问、写访问或读/写访问的常熟。从源代码可以看到FileAccess是一个简单枚举。
枚举成员 成员值 描述 Read 1 对文件的读访问,拥有读取权限。
Write 2 对文件的写访问,拥有写入权限。
ReadWrite 3 对文件的读访问和写访问,拥有读取和写入两个权限。
一、构造函数
FileStream的构造函数居然有15个之多。总之就是new就行了。
二、公共属性
CanRead 获取一个值,该值指示当前流是否支持读取。
CanSeek 获取一个值,该值指示当前流是否支持查找。
CanTimeout 获取一个值,该值确定当前流是否可以超时。(从 Stream 继承。)
CanWrite 获取一个值,该值指示当前流是否支持写入。
Handle 获取当前 FileStream 对象所封装文件的操作系统文件句柄。
IsAsync 获取一个值,该值指示 FileStream 是异步还是同步打开的。
Length 获取用字节表示的流长度。
Name 获取传递给构造函数的 FileStream 的名称。
Position 获取或设置此流的当前位置。
ReadTimeout 获取或设置一个值,该值指示尝试读取多长时间后超时。
SafeFileHandle 获取 SafeFileHandle 对象,该对象表示当前 FileStream 对象封装的文件的操作系统文件句柄。
WriteTimeout 获取或设置一个值,该值确定流在超时前尝试写入多长时间。 (从 Stream 继承。)
三、公共方法
BeginRead 已重写。 开始异步读。
BeginWrite 已重写。 开始异步写。
Close 关闭当前流并释放与之关联的所有资源(如套接字和文件句柄)。 (从 Stream 继承。)
CreateObjRef 创建一个对象,该对象包含生成用于与远程对象进行通信的代理所需的全部相关信息。 (从 MarshalByRefObject 继承。)
Dispose 已重载。释放流所占用的资源。
EndRead 已重写。 等待挂起的异步读取完成。
EndWrite 已重写。 结束异步写入,在 I/O 操作完成之前一直阻止。
Flush 已重写。 清除该流的所有缓冲区,使得所有缓冲的数据都被写入到基础设备。
GetAccessControl 获取 FileSecurity 对象,该对象封装当前 FileStream 对象所描述的文件的访问控制列表 (ACL) 项。
GetLifetimeService 检索控制此实例的生存期策略的当前生存期服务对象。 (从 MarshalByRefObject 继承。)
InitializeLifetimeService 获取控制此实例的生存期策略的生存期服务对象。 (从 MarshalByRefObject 继承。)
Lock 允许读取访问的同时防止其他进程更改 FileStream。
Read 已重写。 从流中读取字节块并将该数据写入给定缓冲区中。
ReadByte 已重写。 从文件中读取一个字节,并将读取位置提升一个字节。
Seek 已重写。 将该流的当前位置设置为给定值。
SetAccessControl 将 FileSecurity 对象所描述的访问控制列表 (ACL) 项应用于当前 FileStream 对象所描述的文件。
SetLength 已重写。 将该流的长度设置为给定值。
Synchronized 在指定的 Stream 对象周围创建线程安全(同步)包装。 (从 Stream 继承。)
Unlock 允许其他进程访问以前锁定的某个文件的全部或部分。
Write 已重写。 使用从缓冲区读取的数据将字节块写入该流。
WriteByte 已重写。 将一个字节写入文件流的当前位置。
以下给出代码示例(注意using或Dispose(),此处略过了):
FileStream fs = new FileStream(@"E:\file.txt", FileMode.Create); //打开一个写入流
Console.WriteLine(fs.CanRead); //该属性值指示文件是否可读 True
Console.WriteLine(fs.CanSeek); //该属性值指示文件是否支持查找 True
Console.WriteLine(fs.CanTimeout); //该属性值指示文件是否支持超时 False
Console.WriteLine(fs.CanWrite); //该属性值指示文件是否可写 True
Console.WriteLine(fs.IsAsync); //该属性值指示文件是否是异步打开,异步打开则返回true,同步打开则返回false False
Console.WriteLine(fs.Length); //获取用字节流表示的长度 16 与硬盘中显示的大小一样。
Console.WriteLine(fs.Name); //获取传递给构造函数的文件名称 E:\file.txt
Console.WriteLine(fs.Position); //获取和设置此流的当前位置,注意此方法是可赋值设置的。 0 fs.Position = 100;
//Console.WriteLine(fs.ReadTimeout); //获取和设置一个值,该值指示尝试读取多长时间后超时,可以赋值超时,如果流上不支持超时(即fs.CanTimeout为false)则引发异常。
//Console.WriteLine(fs.WriteTimeout); //获取和设置一个值,尝试写入多长时间后算超时。如果不支持超时(即fs.CanTimeout为false)则引发异常。 //写入流
string str = "你好吗?";
byte[] bytes = Encoding.UTF8.GetBytes(str);
fs.Write(bytes, 0, bytes.Length);
fs.Flush(); //流会缓冲,此行代码指示流不要缓冲数据,立即写入到文件。
fs.Close(); //关闭流并释放所有资源,同时将缓冲区的没有写入的数据,写入然后再关闭。
fs.Dispose(); //释放流所占用的资源,Dispose()会调用Close(),Close()会调用Flush(); 也会写入缓冲区内的数据。 //写入流,追加文本
FileStream fs = new FileStream(@"E:\file.txt", FileMode.Append, FileAccess.Write); //追加流,权限设置为可写
byte[] bytes = Encoding.UTF8.GetBytes("好想回家过年了!");
fs.Write(bytes, 0, bytes.Length);
fs.Flush(); //E:\file.txt文本变为 你好吗?好想回家过年了! 原来文本的内容是:你好吗? //写入流,逐个字符逐个字符吸入
FileStream fs = new FileStream(@"E:\tianyi.txt", FileMode.CreateNew, FileAccess.Write); //在E盘下创建了E:\tianyi.txt并写入 天意啊!
byte[] bytes = Encoding.UTF8.GetBytes("天意啊!");
foreach (byte b in bytes)
{
fs.WriteByte(b); //逐个字节逐个字节追加入文本
}
fs.Flush(); //读取内容
FileStream fs1 = new FileStream(@"E:\file.txt", FileMode.Open, FileAccess.Read, FileShare.Read);
byte[] bytes = new byte[fs1.Length];
fs1.Read(bytes, 0, fs1.Length);
Console.WriteLine(Encoding.UTF8.GetString(bytes)); //将读取到的值获取成字符串输出 //逐个字符读取
FileStream fs = new FileStream(@"E:\file.txt", FileMode.Open, FileAccess.ReadWrite);
byte[] bytes = new byte[fs.Length];
for (int i = 0; i < fs.Length; i++)
{
bytes[i] = (byte)fs.ReadByte(); //逐个字节逐个字节的读取,当读取完之后会自动将当前读取位置移动到下一位
}
Console.WriteLine(Encoding.UTF8.GetString(bytes)); //输出E:\file.txt的文本内容 "你好吗" //未明白的东西
//fs.Handle
//fs.SafeFileHandle
//CreateObjRef
//GetAccessControl
//GetLifetimeService
//InitializeLifetimeService
//SetAccessControl
//Synchronized
FileStream类的更多相关文章
- .net学习之集合、foreach原理、Hashtable、Path类、File类、Directory类、文件流FileStream类、压缩流GZipStream、拷贝大文件、序列化和反序列化
1.集合(1)ArrayList内部存储数据的是一个object数组,创建这个类的对象的时候,这个对象里的数组的长度为0(2)调用Add方法加元素的时候,如果第一次增加元神,就会将数组的长度变为4往里 ...
- FileStream类的使用(文件流)
1.什么是FileStream类 FileStream 类对文件系统上的文件进行读取.写入.打开和关闭操作,并对其他与文件相关的操作系统句柄进行操作,如管道.标准输入和标准输出.读写操作可以指定为同步 ...
- 07.使用FileStream类来实现对大文件的复制
namespace _20.使用FileStream类来实现多媒体文件的复制 { class Program { static void Main(string[] args) { //需要被复制的文 ...
- 06.FileStream类的学习
//FileStream类是用来操作字节的,也就是可以操作所有文件. 因为所有的文件都是以字节形式来存储的. //StreamReader类和StreamWriter类是用来操作字符的. FileSt ...
- 文件读写(三)利用FileStream类操作字节数组byte[]、BinaryFormatter、内存流MemoryStream
一.Stream类概述 在.NET Framework中,文件和流是有区别的.文件是存储在磁盘上的数据集,它具有名称和相应的路径.当打开一个文件并对其进行读/写时,该文件就称为流(stream).但是 ...
- c#语言 中FileStream类的基本使用
FileStream类不是静态类,使用时需要创建对象,FileStream类既可以对文本文件进行读也可以对多媒体文件进行写,以字节数组的形式进行读和写,多用于对大文件进行读写,区别于File类的是它对 ...
- 【C# IO 操作】 Path 路径类 |Directory类 |DirectoryInfo 类|DriveInfo类|File类|FileInfo类|FileStream类
Directory类 Directory类 是一个静态类,常用的地方为创建目录和目录管理. 一下来看看它提供的操作. 1.CreateDirectory 根据指定路径创建目录.有重载,允许一次过创建多 ...
- asp.net中用FileStream类实现下载文件功能,自定义下载路径,像IE下载一样
方法一: //这个值可以从配置文件读取,或者放个textbox让用户填 string path = "你的路径";FileStream outputStream = new Fil ...
- FileStream类操作文件
private void buttonselect_Click (object sender, EventArgs e) { OpenFileDialog ofd ...
随机推荐
- UESTC_Dividing Numbers CDOJ 1156
Dividing Numbers Time Limit: 9000/3000MS (Java/Others) Memory Limit: 262144/262144KB (Java/Other ...
- hdu 1159 Common Subsequence(LCS最长公共子序列)
Common Subsequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- IO之流程与buffer概览
为了说明这个流程,还是用图来描述一下比较直观. 中间过程请参考 <IO之内核buffer----"buffer cache"> <IO之标准C库buffer> ...
- 第17讲- UI常用组件之ImageView图片浏览
第17讲 UI常用组件之ImageView图片浏览 二.图片浏览ImageView ImageView就是一个用来显示图片的视图: ImageView常见属性 常见属性 对应方法 说明 android ...
- WPF页面切换及弹窗
WPF页面切换及弹窗 结构如图: 效果如图: 代码如下: xaml <Window x:Class="PageChange.MainWindow" xmlns="h ...
- WPF动画
System.Windows.Media.Animation 这个命名空间中,包含了三种动画类:线性插值动画类(17个).关键帧动画(22个).路径动画(3个). 线性插值动画类(17个)如下: By ...
- Lua Table 操作
Lua中table类似与C#种的字典,其实就是一个key-value键值对数据结构.来学习下table基本操作 Table的创建 myTable = {} --表名后面使用{}赋值,表示一个空的表 m ...
- 成语接龙(dfs)
成语接龙 Time Limit: 1000 MS Memory Limit: 32768 K Total Submit: 92(17 users) Total Accepted: 23(14 user ...
- QOdbc 读写 excel
).toString(); ).toInt(); qDebug()<< name << age <<endl; } // 关闭数据库 db.close(); } i ...
- hdu 5071 Chat(模拟|Splay)
Chat Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others) Total Sub ...