C#中FileStream和StreamWriter/StreamReader的區別


 
本篇可能不是非常深入,但是勝在清晰明了
 
FileStream對象表示在磁盤或網絡路徑上指向文件的流。 這個類提供了在文件中讀寫字節的方法但經常使用StreamReader或 StreamWriter執行這些功能。這是因為 FileStream類操作的是字節和字節數組,而Stream類操作的是字符數據。這是這兩種類的一個重要區別,如果你是准備讀取byte數據的話,用StreamReader讀取然后用 System.Text.Encoding.Default.GetBytes轉化的話,如下,則可能出現數據丟失的情況,如byte數據的個數不對等。因此 操作byte數據時要用FileStream。 string textContent = fileStream.ReadToEnd();byte[] bytes = System.Text.Encoding.Default.GetBytes(textContent);
字符數據易於使用, 但是有些操作,比如隨機文件訪問(訪問文件中間某點的數據),就必須由FileStream對象執行.
其中創建FileStream對象最簡單的構造函數如下:
     FileStream file = new FileStream(fileName,FileMode.Member);// 默認方式,可讀可寫
     FileStream file = new FileStream(fileName, FileMode.Member, FileAccess.Member);
     而FileAccess的成員:

成 員

說 明

Read

打開文件,用於只讀

Write

打開文件,用於只寫

ReadWrite

打開文件,用於讀寫

對文件進行不是FileAccess枚舉成員指定的操作會導致拋出異常。此屬性的作用是,基於用戶的身份驗證級別改變用戶對文件的訪問權限。

在FileStream構造函數不使用FileAccess枚舉參數的版本中,使用默認值FileAccess. ReadWrite。

FileMode枚舉成員,使用每個值會發生什么,取決於指定的文件名是否表示已有的文件

成 員

文 件 存 在

文件不存在

Append

打開文件,流指向文件的末尾,只能與枚舉FileAccess.Write聯合使用

創建一個新文件。只能與枚舉FileAccess.Write聯合使用

Create

刪除該文件,然后創建新文件

創建新文件

CreateNew

拋出異常

創建新文件

Open

打開現有的文件,流指向文件的開頭

拋出異常

OpenOrCreate

打開文件,流指向文件的開頭

創建新文件

Truncate

打開現有文件,清除其內容。流指向文件的開頭,保留文件的初始創建日期

拋出異常

FileStream類操作的是字節和字節數組,而Stream類操作的是字符數據
StreamWriter允許將字符和字符串寫入文件,它處理底層的轉換,向FileStream對象寫入數據。StreamReader也類似。
實例:
  using System;
  using System.Data;
  using System.IO;
  using System.Text;

  /// Summary description for FileReadAndWrite
  public class FileReadAndWrite
 {
     public FileReadAndWrite()
     {
         // TODO: Add constructor logic here
     }
     /// 用FileStream寫文件
     public void FileStreamWriteFile(string str)
     {
         byte[] byData;
         char[] charData;
         try
         {
             FileStream nFile = new FileStream("love.txt", FileMode.Create);
             //獲得字符數組
             charData = str.ToCharArray();
             //初始化字節數組
             byData = new byte[charData.Length];
             //將字符數組轉換為正確的字節格式
             Encoder enc = Encoding.UTF8.GetEncoder();
             enc.GetBytes(charData, 0, charData.Length,byData,0,true);
             nFile.Seek(0, SeekOrigin.Begin);
             nFile.Write(byData, 0, byData.Length);
         }
         catch (Exception ex)
         {
             throw ex;
         }
     }
     /// FileStream讀取文件
     public string FileStreamReadFile(string filePath)
     {
         byte[] data = new byte[100];
         char[] charData = new char[100];
         try
         {
             FileStream file = new FileStream(filePath, FileMode.Open);
             //文件指針指向0位置
             file.Seek(0, SeekOrigin.Begin);
             //讀入兩百個字節
             file.Read(data, 0, 200);
             //提取字節數組
             Decoder dec = Encoding.UTF8.GetDecoder();
             dec.GetChars(data, 0, data.Length, charData, 0);
         }
         catch (Exception ex)
         {
             throw ex;
         }
         return Convert.ToString(charData);
     }
     /// StreamWriter寫文件
     public void StreamWriterWriteFile()
     {
         try
         {
             FileStream nFile = new FileStream("love.txt", FileMode.CreateNew);
             StreamWriter writer = new StreamWriter(nFile);
 
             writer.WriteLine("I love You!");
             writer.WriteLine("Do you love me!");
             writer.Close();
         }
         catch
         { }
     }
     /// StreamReader讀取文件
     public string StreamReaderReadFile()
     {
         string str="";
         try
         {
             FileStream file = new FileStream("love.txt", FileMode.Open);
             StreamReader sr = new StreamReader(file);
             while (sr.ReadLine()!=null)
             {
                str += sr.ReadLine();
            }
            //或者str = sr.ReadToEnd();
            sr.Close();
        }
        catch
        { }
        return str;
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM