黑马程序员---.NET高级之文件流FileStream操作
FileStream对象表示在磁盘或网络路径上指向文件的流。这个类提供了在文件中读写字节的方法,但经常使用StreamReader或StreamWriter执行这些功能。这是因为FileStream类操作的是字节和字节数组,而Stream类操作的是字符数据。字符数据易于使用,但是有些操作,比如随机文件访问(访问文件中间某点的数据),就必须由FileStream对象执行,稍后对此进行介绍。
还有几种方法可以创建FileStream对象。构造函数具有许多不同的重载版本,最简单的构造函数仅仅带有两个参数,即文件名和FileMode枚举值。
| FileStream aFile = new FileStream(filename, FileMode.Member); | 
FileMode枚举有几个成员,规定了如何打开或创建文件。稍后介绍这些枚举成员。另一个常用的构造函数如下:
| FileStream aFile = new FileStream(filename, FileMode.Member, FileAccess. Member); | 
第三个参数是FileAccess枚举的一个成员,它指定了流的作用。FileAccess枚举的成员如下表所示。
| 成 员 | 说 明 | 
| Read | 打开文件,用于只读 | 
| Write | 打开文件,用于只写 | 
| ReadWrite | 打开文件,用于读写 | 
对文件进行不是FileAccess枚举成员指定的操作会导致抛出异常。此属性的作用是,基于用户的身份验证级别改变用户对文件的访问权限。
在FileStream构造函数不使用FileAccess枚举参数的版本中,使用默认值FileAccess. ReadWrite。
FileMode枚举成员如下表所示。使用每个值会发生什么,取决于指定的文件名是否表示已有的文件。
| 成 员 | 文 件 存 在 | 文件不存在 | 
| Append | 打开文件,流指向文件的末尾,只能与枚举FileAccess.Write联合使用 | 创建一个新文件。只能与枚举FileAccess.Write联合使用 | 
| Create | 删除该文件,然后创建新文件 | 创建新文件 | 
| CreateNew | 抛出异常 | 创建新文件 | 
| Open | 打开现有的文件,流指向文件的开头 | 抛出异常 | 
| OpenOrCreate | 打开文件,流指向文件的开头 | 创建新文件 | 
| Truncate | 打开现有文件,清除其内容。流指向文件的开头,保留文件的初始创建日期 | 抛出异常 | 
File和FileInfo类都提供了OpenRead()和OpenWrite()方法,更易于创建FileStream对象。前者打开了只读访问的文件,后者只允许写入文件。这些都提供了快捷方式,因此不必以FileStream构造函数的参数形式提供前面所有的信息。例如,下面的代码行打开了用于只读访问的Data.txt文件:
| FileStream aFile = File.OpenRead("Data.txt");
 | 
注意下面的代码执行同样的功能:
| FileInfo aFileInfo = new FileInfo("Data.txt");
FileStream aFile = aFileInfo.OpenRead();
 | 
1. 文件位置
FileStream类维护内部文件指针,该指针指向文件中进行下一次读写操作的位置。在大多数情况下,当打开文件时,它就指向文件的开始位置,但是此指针可以修改。这允许应用程序在文件的任何位置读写,随机访问文件,或直接跳到文件的特定位置上。当处理大型文件时,这非常省时,因为马上可以定位到正确的位置。
实现此功能的方法是Seek()方法,它有两个参数:第一个参数规定文件指针以字节为单位的移动距离。第二个参数规定开始计算的起始位置,用SeekOrigin枚举的一个值表示。Seek Origin枚举包含3个值:Begin、Current和End。
例如,下面的代码行将文件指针移动到文件的第8个字节,其起始位置就是文件的第1个字节:
| aFile.Seek(8,SeekOrigin.Begin); | 
下面的代码行将指针从当前位置开始向前移动2个字节。如果在上面的代码行之后执行下面的代码,文件指针就指向文件的第10个字节:
| aFile.Seek(2,SeekOrigin.Current); | 
注意读写文件时,文件指针也会改变。在读取了10个字节之后,文件指针就指向被读取的第10个字节之后的字节。
也可以规定负查找位置,这可以与SeekOrigin.End枚举值一起使用,查找靠近文件末端的位置。下面的代码会查找文件中倒数第5个字节:
| aFile.Seek(–5, SeekOrigin.End); | 
以这种方式访问的文件有时称为随机访问文件,因为应用程序可以访问文件中的任何位置。稍后介绍的Stream类可以连续地访问文件,不允许以这种方式操作文件指针。
2. 读取数据
使用FileStream类读取数据不像使用StreamReader类读取数据那样容易。这是因为FileStream类只能处理原始字节(raw byte)。处理原始字节的功能使FileStream类可以用于任何数据文件,而不仅仅是文本文件。通过读取字节数据,FileStream对象可以用于读取图像和声音的文件。这种灵活性的代价是,不能使用FileStream类将数据直接读入字符串,而使用StreamReader类却可以这样处理。但是有几种转换类可以很容易地将字节数组转换为字符数组,或者进行相反的操作。
FileStream类操作的是字节和字节数组,而Stream类操作的是字符数据
StreamWriter允许将字符和字符串写入文件,它处理底层的转换,向FileStream对象写入数据。StreamReader也类似。
FileStream.Read()方法是从FileStream对象所指向的文件中访问数据的主要手段。这个方法从文件中读取数据,再把数据写入一个字节数组。它有三个参数:第一个参数是传输进来的字节数组,用以接受FileStream对象中的数据。第二个参数是字节数组中开始写入数据的位置。它通常是0,表示从数组开端向文件中写入数据。最后一个参数指定从文件中读出多少字节。
3. 写入数据
向随机访问文件中写入数据的过程与从中读取数据非常类似。首先需要创建一个字节数组;最简单的办法是首先构建要写入文件的字符数组。然后使用Encoder对象将其转换为字节数组,最后调用Write()方法,将字节数组传送到文件中。
 1 using System;
using System;
  2 using System.Data;
using System.Data;
  3 using System.IO;
using System.IO;
  4 using System.Text;
using System.Text;
  5
  6 /// <summary>
/// <summary>
  7 /// Summary description for FileReadAndWrite
/// Summary description for FileReadAndWrite
  8 /// </summary>
/// </summary>
  9 public class FileReadAndWrite
public class FileReadAndWrite
 10 {
{
 11 public FileReadAndWrite()
    public FileReadAndWrite()
 12 {
    {
 13 //
        //
 14 // TODO: Add constructor logic here
        // TODO: Add constructor logic here
 15 //
        //
 16 }
    }
 17 /// <summary>
    /// <summary>
 18 /// 用FileStream写文件
    /// 用FileStream写文件
 19 /// </summary>
    /// </summary>
 20 /// <param name="str"></param>
    /// <param name="str"></param>
 21 /// <returns></returns>
    /// <returns></returns>
 22 public void FileStreamWriteFile(string str)
    public void FileStreamWriteFile(string str)
 23 {
    {
 24 byte[] byData;
        byte[] byData;
 25 char[] charData;
        char[] charData;
 26 try
        try
 27 {
        {
 28 FileStream nFile = new FileStream("love.txt", FileMode.Create);
            FileStream nFile = new FileStream("love.txt", FileMode.Create);
 29 //获得字符数组
            //获得字符数组
 30 charData = str.ToCharArray();
            charData = str.ToCharArray();
 31 //初始化字节数组
            //初始化字节数组
 32 byData = new byte[charData.Length];
            byData = new byte[charData.Length];
 33 //将字符数组转换为正确的字节格式
            //将字符数组转换为正确的字节格式
 34 Encoder enc = Encoding.UTF8.GetEncoder();
            Encoder enc = Encoding.UTF8.GetEncoder();
 35 enc.GetBytes(charData, 0, charData.Length,byData,0,true);
            enc.GetBytes(charData, 0, charData.Length,byData,0,true);
 36 nFile.Seek(0, SeekOrigin.Begin);
            nFile.Seek(0, SeekOrigin.Begin);
 37 nFile.Write(byData, 0, byData.Length);
            nFile.Write(byData, 0, byData.Length);
 38 }
        }
 39 catch (Exception ex)
        catch (Exception ex)
 40 {
        {
 41 throw ex;
            throw ex;
 42 }
        }
 43 }
    }
 44 /// <summary>
    /// <summary>
 45 /// FileStream读取文件
    /// FileStream读取文件
 46 /// </summary>
    /// </summary>
 47 /// <param name="filePath"></param>
    /// <param name="filePath"></param>
 48 /// <returns></returns>
    /// <returns></returns>
 49 public string FileStreamReadFile(string filePath)
    public string FileStreamReadFile(string filePath)
 50 {
    {
 51 byte[] data = new byte[100];
        byte[] data = new byte[100];
 52 char[] charData = new char[100];
        char[] charData = new char[100];
 53 try
        try
 54 {
        {
 55 FileStream file = new FileStream(filePath, FileMode.Open);
            FileStream file = new FileStream(filePath, FileMode.Open);
 56 //文件指针指向0位置
            //文件指针指向0位置
 57 file.Seek(0, SeekOrigin.Begin);
            file.Seek(0, SeekOrigin.Begin);
 58 //读入两百个字节
            //读入两百个字节
 59 file.Read(data, 0, 200);
            file.Read(data, 0, 200);
 60 //提取字节数组
            //提取字节数组
 61 Decoder dec = Encoding.UTF8.GetDecoder();
            Decoder dec = Encoding.UTF8.GetDecoder();
 62 dec.GetChars(data, 0, data.Length, charData, 0);
            dec.GetChars(data, 0, data.Length, charData, 0);
 63 }
        }
 64 catch (Exception ex)
        catch (Exception ex)
 65 {
        {
 66 throw ex;
            throw ex;
 67 }
        }
 68 return Convert.ToString(charData);
        return Convert.ToString(charData);
 69 }
    }
 70 /// <summary>
    /// <summary>
 71 /// StreamWriter写文件
    /// StreamWriter写文件
 72 /// </summary>
    /// </summary>
 73 public void StreamWriterWriteFile()
    public void StreamWriterWriteFile()
 74 {
    {
 75 try
        try
 76 {
        {
 77 FileStream nFile = new FileStream("love.txt", FileMode.CreateNew);
            FileStream nFile = new FileStream("love.txt", FileMode.CreateNew);
 78 StreamWriter writer = new StreamWriter(nFile);
            StreamWriter writer = new StreamWriter(nFile);
 79
 80 writer.WriteLine("I love You!");
            writer.WriteLine("I love You!");
 81 writer.WriteLine("Do you love me!");
            writer.WriteLine("Do you love me!");
 82 writer.Close();
            writer.Close();
 83 }
        }
 84 catch
        catch
 85 { }
        { }
 86 }
    }
 87 /// <summary>
    /// <summary>
 88 /// StreamReader读取文件
    /// StreamReader读取文件
 89 /// </summary>
    /// </summary>
 90 /// <returns></returns>
    /// <returns></returns>
 91 public string StreamReaderReadFile()
    public string StreamReaderReadFile()
 92 {
    {
 93 string str="";
        string str="";
 94 try
        try
 95 {
        {
 96 FileStream file = new FileStream("love.txt", FileMode.Open);
            FileStream file = new FileStream("love.txt", FileMode.Open);
 97 StreamReader sr = new StreamReader(file);
            StreamReader sr = new StreamReader(file);
 98 while (sr.ReadLine()!=null)
            while (sr.ReadLine()!=null)
 99 {
            {
100 str += sr.ReadLine();
                str += sr.ReadLine();
101 }
            }
102 //或者str = sr.ReadToEnd();
            //或者str = sr.ReadToEnd();
103 sr.Close();
            sr.Close();
104 }
        }
105 catch
        catch
106 { }
        { }
107 return str;
        return str;
108 }
    }
109 }
}
110
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号