C#使用FileStream类从文本中读数据
FileStream对象表示在磁盘或网络路径上指向文件的流。这个类提供了在文件中读写字节的方法,但经常使用StreamReader或StreamWriter执行这些功能。这是因为FileStream类操作的是字节和字节数组,而Stream类操作的是字符数据。字符数据易于使用,但是有些操作,比如随机文件访问(访问文件中间某点的数据),就必须由FileStream对象执行。
一、创建FileStream对象
1、FileStream对象最简单的构造函数仅仅带有两个参数,即文件名和FileMode枚举值。
FileStream aFile = new FileStream(filename, FileMode);
2、另一个常用的构造函数如下:
FileStream aFile = new FileStream(filename, FileMode, FileAccess);
三个参数的意义分别为:filename文件名,FileMode枚举类型,表示如何打开文件的模式。FileAccess也是枚举类型,用于改变对用户的访问权限。
FileMode枚举成员:
使用每个值会发生什么,取决于指定的文件名是否表示已有的文件。注意创建流时该流指向文件中的位置,除非特别说明,否则流就指向文件的开头。
Append
文件存在打开文件,当前位置指向文件的末尾,只能与枚举FileAccess.Write联合使用。文件不存在创建新文件。
Create
文件存在删除该文件,然后创建新文件。文件不存在创建新文件。
CreateNew
文件存在抛出异常,文件不存在创建新文件。
Open
文件存在打开现有的文件,流指向文件的开头。文件不存在抛出异常
OpenOrCreate
文件存在打开文件,流指向文件的开头。文件不存在创建新文件并打开
Truncate
打开现有文件,清除其内容。流指向文件的开头,保留文件的初始创建日期。文件不存在抛出异常。
FileAccess枚举成员:
Read
打开文件,用于只读
Write
打开文件,用于只写
ReadWrite
打开文件,用于读写
对文件进行不是FileAccess枚举成员指定的操作会导致抛出异常。此属性的作用是,基于用户的身份验证级别改变用户对文件的访问权限。
在FileStream构造函数不使用FileAccess枚举参数的版本中,使用默认值FileAccess. ReadWrite。
3、创建FileStream对象,不必以FileStream构造函数的参数形式提供前面所有的信息。File和FileInfo类都提供了OpenRead()和OpenWrite()方法,更易于创建FileStream对象。前者打开了只读访问的文件,后者只允许写入文件。
我们回顾一下:
Open方法打开文件,返回文件流FileStream对象。
OpenRead方法打开现有文件来读取数据,返回只读流FileStream对象。
OpenWrite方法打开现在文件以进行写入,返回只写不共享的FileStream对象。
例如,下面的代码行打开了用于只读访问的Text.txt文件:
FileStream aFile = File.OpenRead("Test.txt");
注意下面的代码执行同样的功能:
FileInfo aFileInfo = new FileInfo("Test.txt");
FileStream aFile = aFile.OpenRead();
二、读取数据
使用FileStream类读取数据不像StreamReader类读取数据那样容易。这是因为FileStream类只能处理原始字节(raw byte)。处理原始字节的功能使FileStream类可以用于任何数据文件,而不仅仅是文本文件。通过读取字节数据,FileStream对象可以用于读取图像和声音的文件。这种灵活性的代价是,不能使用FileStream类将数据直接读入字符串,而使用StreamReader类却可以这样处理。但是有几种转换类可以很容易地将字节数组转换为字符数组,或者进行相反的操作。
FileStream.Read()方法是从FileStream对象所指向的文件中访问数据的主要手段。这个方法从文件中读取数据,再把数据写入一个字节数组。它有三个参数:第一个参数是传输进来的字节数组,用以接受FileStream对象中的数据。第二个参数是字节数组中开始写入数据的位置。它通常是0,表示从数组开端向文件中写入数据。最后一个参数指定从文件中读出多少字节。
下面我们看实例:
using System;
using System.Text;
using System.IO;
class Program
{
static void Main()
{
Console.WriteLine("要输入要读取的路径,指定路径的完整名称");
string path = Console.ReadLine();
try
{
if (File.Exists(path))
{
FileStream fs = File.OpenRead(path);
byte[]str = new byte[200];
while (fs.Read(str, 0, str.Length) > 0)
{
Console.WriteLine(System.Text.Encoding.Default.GetString(str));
}
fs.Close();
}
else
Console.WriteLine("该文件不存在");
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Console.ReadLine();
}
}
从键盘接收文件路径,然后使用Exits方法判断文件是否存在,如果存在,则使用FileStream类的OpenRead方法打开并读取,将读到的数据存放在字节数组中,然后将字节按默认编码方式解码成字符串并输出到控制台。流不使用时,一定要及时关闭。fs.Close()关闭流。