C# FileStream對象


FileStream對象表示在磁盤或網絡路徑上指向文件的流。當類提供向文件讀寫字節的方法時,經常使用StreamReader或StreamWriter執行這些功能。這是因為FileStream類操作字節和字節數組,而Stream類操作字符數據。字符數據易於使用,但是有些操作比如隨機文件訪問,就必須由FileStream對象執行。

FileStream對象的構造函數:

FileStream aFile = new FileStream(“Log.txt”,FileMode.OpenOrCreate);

 FileMode枚舉具有幾種成員:

Append------如果文件存在,就打開文件,將文件位置移動到文件的末尾,並創建一個新文件。FileMode.Append僅可以與枚舉Fileaccess.Write聯合使用

Create------創建新文件;如果存在這樣的文件,就破壞它。

CreateNew------創建新文件,但是如果已經存在此文件,則拋出異常

Open------打開現有的文件,但是不存在所指定的文件,則拋出異常

OpenOrCreate------如果文件存在,則規定打開文件,否則就創建新文件,如果文件已經存在,則保留在文件中的數據

Truncate------打開現有文件,清除其內容,然后我們可以向文件寫入全新的數據,但是保留文件的初始創建日期,必須存在有文件,否則就拋出異常

訪問級別

前面的構造函數默認以只讀模式打開文件,需要一個附加參數規定不同的訪問級別,此參數是FileAccess參數。

FileStream aFile=new FileStream(”Log.txt”,fileMode.OpenOrCreate,FileAccess.Write)

FileAccess枚舉有三種類型:Read、Write、ReadWrite.此屬性的作用是:基於用戶的身份驗證級別改變用戶對文件的訪問

讀取文件的位置用seek:public long Seek(long offset,SeekOrigin origin)

 Long offset是規定文件指針以字節為單位的移動距離;SeekOrigin origin是規定開始計算的起始位置,此枚舉包含3個值:Begin,Current和End。

例:aFile.Seek(8,SeekOrigin.Begin);// SeekOrigin.Begin指得是文件指針從文件的第一個字節起;而參數‘8‘指得是移動到文件的第8個字節

例2:afile.Seek(2,SeekOrigin.Current)//在當前位置開始,再移動2個字節。

例3:aFile.Seek(-5,SeekOrigin.End)//在文件末端位置開始,倒數5個字節。

讀取數據

使用FileStream類讀取數據不像使用StreamReader和StreamWriter類讀取數據那么容易,這是因為FileStream類只能處理原始字節(raw byey),這使得FileStream類可以用於任何數據文件,而不僅僅是文本文件,通過讀取字節數據就可以讀取類似圖像和聲音的文件。這種靈活性的代價是不能使用它直接讀入字符串,而使用StreamWriter和StreaMeader類卻可以這樣處理,從是有幾種轉換類可以很容易地將字節數組轉換為字符數組,或者進行相反的操作。

Read()方法是從FileStream對象所指向的文件訪問數據的主要手段:

Public int Read(byte[] array,int offset, int count)//第一個參數是被傳輸進來的字節數組,用以接受FileStream對象中的數據。第二個參數是字節數組中開始寫入數據的位置,它通常是0,表示從數組的開端的文件中向數組寫數據,最后一個參數是規定從文件中讀出多少字節。

寫入數據

寫入數據的流程是先獲取字節數組,再把字節數據轉換為字符數組,然后把這個字符數組用Write()方法寫入到文件中,當然在寫入的過程中,可以確定在文件的什么位置寫入,寫多少字符等等。

文件讀寫的范例:

讀取文件
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;

namespace myFile
{
    class PRogram
    {
        static void Main(string[] args)
        {
            byte[] byData = new byte[100];//建立一個FileStream要用的字節組
            char[] charData = new char[100];//建立一個字符組

            try
            {
                FileStream aFile = new FileStream("../../../../Data.txt", FileMode.Open);//實例化一個FileStream對象,用來操作data.txt文件,操作類型是
                
                aFile.Seek(55, SeekOrigin.Begin);//把文件指針指向,從文件開始位置向前55位字節所指的字節
                aFile.Read(byData, 0, 100);//讀取FileStream對象所指的文件到字節數組里
            }
            catch (IOException e)
            {
                Console.WriteLine("close");
                return;
            }
            Decoder d = Encoding.UTF8.GetDecoder();//
            d.GetChars(byData, 0, byData.Length, charData, 0);//將編碼字節數組轉換為字符數組

            Console.WriteLine(charData);
            Console.ReadLine();
            return;
        }
    }
}

寫入文件:
 
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;

namespace myFile
{
    class Program
    {
        static void Main(string[] args)
        {
            byte[] byData = new byte[100];//建立一個FileStream要用的字節組
            char[] charData = new char[100];//建立一個字符組

            try
            {
                FileStream aFile = new FileStream("../../../../Data.txt", FileMode.Open);//實例化一個FileStream對象,用來操作data.txt文件,操作類型是
               
                charData = "我是誰?111?".ToCharArray();//將字符串內的字符復制到字符組里
                aFile.Seek(0, SeekOrigin.End);
                Encoder el = Encoding.UTF8.GetEncoder();//編碼器
                el.GetBytes(charData, 0, charData.Length, byData, 0, true);

                aFile.Write(byData, 0, byData.Length);
            }
            catch (IOException e)
            {
                Console.WriteLine("close");
                return;
            }
           
        }
    }
}


免責聲明!

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



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