.net中的文件和各种流的区分以及各种操作 对各种资源的读取
字节流的操作就是filestream
C#使用FileStream类从文本中读数据
2010-05-17 19:42:52| 分类: c#学习入门|字号 订阅
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()关闭流
字符流的操作有:streamreader 和streamwriter
FileStream对象通常会在StreamWriter或StreamReader内使用,并使用它们的方法处理文件。
/// <summary>
/// StreamWriter写入方法
/// </summary>
private void StreamWriterMetod()
{
try
{
FileStream fsFile = new FileStream(@"d:\log.txt",FileMode.OpenOrCreate);
StreamWriter swWriter = new StreamWriter(fsFile);
//写入数据
swWriter.WriteLine("Hello Wrold.");
swWriter.WriteLine("It is now {0}", DateTime.Now.ToLongDateString());
swWriter.Close();
}
catch (Exception e)
{
throw e;
}
}
/// <summary>
/// StreamWriter读取方法
/// </summary>
private void StreamReaderMetod()
{
string sLine = "";
try
{
FileStream fsFile = new FileStream(@"d:\log.txt", FileMode.Open);
StreamReader srReader = new StreamReader(fsFile);
//读取文件(读取大文件时,最好不要用此方法)
sLine = srReader.ReadToEnd();
txbValue.Text = sLine;
srReader.Close();
}
catch (Exception e)
{
throw e;
}
}
/// <summary>
/// StreamWriter读取方法2
/// </summary>
private void StreamReaderMetodTwo()
{
try
{
FileStream fsFile = new FileStream(@"d:\log.txt", FileMode.Open);
StreamReader srReader = new StreamReader(fsFile);
int iChar;
iChar = srReader.Read();
while (iChar != -1)
{
txbValue.Text += (Convert.ToChar(iChar));
iChar = srReader.Read();
}
srReader.Close();
}
catch (Exception e)
{
throw e;
}
}
注:FileMode枚举成员值在文件存在与不存在时的情况
Append
文件存在时:打开文件,流指向文件的末尾,只能与枚举FileAcess.Write联合使用
文件不存在时:创建一个新文件。只能与枚举FileAcess.Write联合使用
Create
文件存在时:删除该文件,然后创建新文件
文件不存在时:创建新文件
CreateNew
文件存在时:抛出异常
文件不存在时:创建新文件
Open
文件存在时:打开现有文件,流指向文件开头
文件不存在时:抛出异常
OpenOrCreate
文件存在时:打开文件,流指向文件开头
文件不存在时:创建新文件
Truhncate
文件存在时:打开现有文件,清除其内容。流指向文件开头,保留文件的初始创建日期。
文件不存在时:抛出异常
StreamWrite,StreamReader确实是要通过编码方式读取字节流,适合操作字符串,但不是只能处理文本文件,各种字节流都可以通过StreamWrite,StreamReader进行字符串操作。
FileStream顾名思义就知道是用来操作文件流的。
其实说到底只是微软包装过的,用来操作字节流的组件,很多的功能都是重复的,只是有的比较适合,用起来比较方便。你也可以自己写一些xxstream的。
c#中的文件操作:http://www.cnblogs.com/qinfei/archive/2005/11/03/268229.html 里面的内容很全
1、建立一个文本文件
public class FileClass
{
public static void Main()
{
WriteToFile();
}
static void WriteToFile()
{
StreamWriter SW;
SW=File.CreateText("c:\MyTextFile.txt");
SW.WriteLine("God is greatest of them all");
SW.WriteLine("This is second line");
SW.Close();
Console.WriteLine("File Created SucacessFully");
}
}
2、读文件
public class FileClass
{
public static void Main()
{
ReadFromFile("c:\MyTextFile.txt");
}
static void ReadFromFile(string filename)
{
StreamReader SR;
string S;
SR=File.OpenText(filename);
S=SR.ReadLine();
while(S!=null)
{
Console.WriteLine(S);
S=SR.ReadLine();
}
SR.Close();
}
}
3、追加操作
public class FileClass
{
public static void Main()
{
AppendToFile();
}
static void AppendToFile()
{
StreamWriter SW;
SW=File.AppendText("C:\MyTextFile.txt");
SW.WriteLine("This Line Is Appended");
SW.Close();
Console.WriteLine("Text Appended Successfully");
}
}