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()关闭流。